[openwrt/openwrt] rockchip: backport driver updates for rk3528

LEDE Commits lede-commits at lists.infradead.org
Sat Nov 15 11:26:08 PST 2025


hauke pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/c7a26da60d894e1bb6acc4298ee1b54652e66230

commit c7a26da60d894e1bb6acc4298ee1b54652e66230
Author: Tianling Shen <cnsztl at immortalwrt.org>
AuthorDate: Sat Oct 11 17:04:07 2025 +0800

    rockchip: backport driver updates for rk3528
    
    Backport clk/mac/phy driver updates for rk3528.
    
    Signed-off-by: Tianling Shen <cnsztl at immortalwrt.org>
    Link: https://github.com/openwrt/openwrt/pull/20375
    Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
---
 target/linux/rockchip/armv8/config-6.12            |    1 +
 ...k-Document-clock-and-reset-unit-of-RK3528.patch |  792 +++++++++++++
 ...chip-Add-PLL-flag-ROCKCHIP_PLL_FIXED_MODE.patch |   54 +
 ...dd-clock-controller-driver-for-RK3528-SoC.patch | 1193 ++++++++++++++++++++
 ...lk-rockchip-rk3528-Add-reset-lookup-table.patch |  364 ++++++
 ...5-pinctrl-rockchip-Add-support-for-RK3528.patch |  238 ++++
 ...clock-Add-GRF-clock-definition-for-RK3528.patch |   31 +
 ...rockchip-Support-MMC-clocks-in-GRF-region.patch |  156 +++
 ...s-NULL-as-reg-pointer-when-registering-GR.patch |   30 +
 ...p-rk3528-Add-SD-SDIO-tuning-clocks-in-GRF.patch |  157 +++
 ...rockchip-rk3528-add-slab-h-header-include.patch |   30 +
 ...ngs-power-rockchip-Add-support-for-RK3528.patch |   49 +
 ...-pmdomain-rockchip-Add-support-for-RK3528.patch |   81 ++
 ...naneng-combphy-Add-SoC-prefix-to-register.patch |  758 +++++++++++++
 ...ockchip-naneng-combphy-Add-RK3528-support.patch |  231 ++++
 ...dc-rockchip_saradc-Add-support-for-RK3528.patch |   57 +
 ...mmac-dwmac-rk-Add-GMAC-support-for-RK3528.patch |  166 +++
 ...dwmac-rk-Move-integrated_phy_powerup-down.patch |  126 +++
 ...-rk-Add-integrated_phy_powerdown-operatio.patch |  112 ++
 ...c-dwmac-rk-Add-initial-support-for-RK3528.patch |   84 ++
 ...-rk-Remove-unneeded-GRF-and-peripheral-GR.patch |  572 ++++++++++
 21 files changed, 5282 insertions(+)

diff --git a/target/linux/rockchip/armv8/config-6.12 b/target/linux/rockchip/armv8/config-6.12
index 1200605efe..c67493cab2 100644
--- a/target/linux/rockchip/armv8/config-6.12
+++ b/target/linux/rockchip/armv8/config-6.12
@@ -128,6 +128,7 @@ CONFIG_CLK_RK3308=y
 CONFIG_CLK_RK3328=y
 CONFIG_CLK_RK3368=y
 CONFIG_CLK_RK3399=y
+CONFIG_CLK_RK3528=y
 CONFIG_CLK_RK3568=y
 CONFIG_CLK_RK3576=y
 CONFIG_CLK_RK3588=y
diff --git a/target/linux/rockchip/patches-6.12/032-18-v6.15-dt-bindings-clock-Document-clock-and-reset-unit-of-RK3528.patch b/target/linux/rockchip/patches-6.12/032-18-v6.15-dt-bindings-clock-Document-clock-and-reset-unit-of-RK3528.patch
new file mode 100644
index 0000000000..af7ffc916c
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/032-18-v6.15-dt-bindings-clock-Document-clock-and-reset-unit-of-RK3528.patch
@@ -0,0 +1,792 @@
+From e0c0a97bc308f71b0934e3637ac545ce65195df0 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Mon, 17 Feb 2025 06:11:42 +0000
+Subject: [PATCH] dt-bindings: clock: Document clock and reset unit of RK3528
+
+There are two types of clocks in RK3528 SoC, CRU-managed and
+SCMI-managed. Independent IDs are assigned to them.
+
+For the reset part, differing from previous Rockchip SoCs and
+downstream bindings which embeds register offsets into the IDs, gapless
+numbers starting from zero are used.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
+Link: https://lore.kernel.org/r/20250217061142.38480-6-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ .../bindings/clock/rockchip,rk3528-cru.yaml   |  64 +++
+ .../dt-bindings/clock/rockchip,rk3528-cru.h   | 453 ++++++++++++++++++
+ .../dt-bindings/reset/rockchip,rk3528-cru.h   | 241 ++++++++++
+ 3 files changed, 758 insertions(+)
+ create mode 100644 Documentation/devicetree/bindings/clock/rockchip,rk3528-cru.yaml
+ create mode 100644 include/dt-bindings/clock/rockchip,rk3528-cru.h
+ create mode 100644 include/dt-bindings/reset/rockchip,rk3528-cru.h
+
+--- /dev/null
++++ b/Documentation/devicetree/bindings/clock/rockchip,rk3528-cru.yaml
+@@ -0,0 +1,64 @@
++# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
++%YAML 1.2
++---
++$id: http://devicetree.org/schemas/clock/rockchip,rk3528-cru.yaml#
++$schema: http://devicetree.org/meta-schemas/core.yaml#
++
++title: Rockchip RK3528 Clock and Reset Controller
++
++maintainers:
++  - Yao Zi <ziyao at disroot.org>
++
++description: |
++  The RK3528 clock controller generates the clock and also implements a reset
++  controller for SoC peripherals. For example, it provides SCLK_UART0 and
++  PCLK_UART0 as well as SRST_P_UART0 and SRST_S_UART0 for the first UART
++  module.
++  Each clock is assigned an identifier, consumer nodes can use it to specify
++  the clock. All available clock and reset IDs are defined in dt-binding
++  headers.
++
++properties:
++  compatible:
++    const: rockchip,rk3528-cru
++
++  reg:
++    maxItems: 1
++
++  clocks:
++    items:
++      - description: External 24MHz oscillator clock
++      - description: >
++          50MHz clock generated by PHY module, for generating GMAC0 clocks only.
++
++  clock-names:
++    items:
++      - const: xin24m
++      - const: gmac0
++
++  "#clock-cells":
++    const: 1
++
++  "#reset-cells":
++    const: 1
++
++required:
++  - compatible
++  - reg
++  - clocks
++  - clock-names
++  - "#clock-cells"
++  - "#reset-cells"
++
++additionalProperties: false
++
++examples:
++  - |
++    clock-controller at ff4a0000 {
++        compatible = "rockchip,rk3528-cru";
++        reg = <0xff4a0000 0x30000>;
++        clocks = <&xin24m>, <&gmac0_clk>;
++        clock-names = "xin24m", "gmac0";
++        #clock-cells = <1>;
++        #reset-cells = <1>;
++    };
+--- /dev/null
++++ b/include/dt-bindings/clock/rockchip,rk3528-cru.h
+@@ -0,0 +1,453 @@
++/* SPDX-License-Identifier: (GPL-2.0-only OR MIT) */
++/*
++ * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
++ * Copyright (c) 2024 Yao Zi <ziyao at disroot.org>
++ * Author: Joseph Chen <chenjh at rock-chips.com>
++ */
++
++#ifndef _DT_BINDINGS_CLK_ROCKCHIP_RK3528_H
++#define _DT_BINDINGS_CLK_ROCKCHIP_RK3528_H
++
++/* cru-clocks indices */
++#define PLL_APLL			0
++#define PLL_CPLL			1
++#define PLL_GPLL			2
++#define PLL_PPLL			3
++#define PLL_DPLL			4
++#define ARMCLK				5
++#define XIN_OSC0_HALF			6
++#define CLK_MATRIX_50M_SRC		7
++#define CLK_MATRIX_100M_SRC		8
++#define CLK_MATRIX_150M_SRC		9
++#define CLK_MATRIX_200M_SRC		10
++#define CLK_MATRIX_250M_SRC		11
++#define CLK_MATRIX_300M_SRC		12
++#define CLK_MATRIX_339M_SRC		13
++#define CLK_MATRIX_400M_SRC		14
++#define CLK_MATRIX_500M_SRC		15
++#define CLK_MATRIX_600M_SRC		16
++#define CLK_UART0_SRC			17
++#define CLK_UART0_FRAC			18
++#define SCLK_UART0			19
++#define CLK_UART1_SRC			20
++#define CLK_UART1_FRAC			21
++#define SCLK_UART1			22
++#define CLK_UART2_SRC			23
++#define CLK_UART2_FRAC			24
++#define SCLK_UART2			25
++#define CLK_UART3_SRC			26
++#define CLK_UART3_FRAC			27
++#define SCLK_UART3			28
++#define CLK_UART4_SRC			29
++#define CLK_UART4_FRAC			30
++#define SCLK_UART4			31
++#define CLK_UART5_SRC			32
++#define CLK_UART5_FRAC			33
++#define SCLK_UART5			34
++#define CLK_UART6_SRC			35
++#define CLK_UART6_FRAC			36
++#define SCLK_UART6			37
++#define CLK_UART7_SRC			38
++#define CLK_UART7_FRAC			39
++#define SCLK_UART7			40
++#define CLK_I2S0_2CH_SRC		41
++#define CLK_I2S0_2CH_FRAC		42
++#define MCLK_I2S0_2CH_SAI_SRC		43
++#define CLK_I2S3_8CH_SRC		44
++#define CLK_I2S3_8CH_FRAC		45
++#define MCLK_I2S3_8CH_SAI_SRC		46
++#define CLK_I2S1_8CH_SRC		47
++#define CLK_I2S1_8CH_FRAC		48
++#define MCLK_I2S1_8CH_SAI_SRC		49
++#define CLK_I2S2_2CH_SRC		50
++#define CLK_I2S2_2CH_FRAC		51
++#define MCLK_I2S2_2CH_SAI_SRC		52
++#define CLK_SPDIF_SRC			53
++#define CLK_SPDIF_FRAC			54
++#define MCLK_SPDIF_SRC			55
++#define DCLK_VOP_SRC0			56
++#define DCLK_VOP_SRC1			57
++#define CLK_HSM				58
++#define CLK_CORE_SRC_ACS		59
++#define CLK_CORE_SRC_PVTMUX		60
++#define CLK_CORE_SRC			61
++#define CLK_CORE			62
++#define ACLK_M_CORE_BIU			63
++#define CLK_CORE_PVTPLL_SRC		64
++#define PCLK_DBG			65
++#define SWCLKTCK			66
++#define CLK_SCANHS_CORE			67
++#define CLK_SCANHS_ACLKM_CORE		68
++#define CLK_SCANHS_PCLK_DBG		69
++#define CLK_SCANHS_PCLK_CPU_BIU		70
++#define PCLK_CPU_ROOT			71
++#define PCLK_CORE_GRF			72
++#define PCLK_DAPLITE_BIU		73
++#define PCLK_CPU_BIU			74
++#define CLK_REF_PVTPLL_CORE		75
++#define ACLK_BUS_VOPGL_ROOT		76
++#define ACLK_BUS_VOPGL_BIU		77
++#define ACLK_BUS_H_ROOT			78
++#define ACLK_BUS_H_BIU			79
++#define ACLK_BUS_ROOT			80
++#define HCLK_BUS_ROOT			81
++#define PCLK_BUS_ROOT			82
++#define ACLK_BUS_M_ROOT			83
++#define ACLK_SYSMEM_BIU			84
++#define CLK_TIMER_ROOT			85
++#define ACLK_BUS_BIU			86
++#define HCLK_BUS_BIU			87
++#define PCLK_BUS_BIU			88
++#define PCLK_DFT2APB			89
++#define PCLK_BUS_GRF			90
++#define ACLK_BUS_M_BIU			91
++#define ACLK_GIC			92
++#define ACLK_SPINLOCK			93
++#define ACLK_DMAC			94
++#define PCLK_TIMER			95
++#define CLK_TIMER0			96
++#define CLK_TIMER1			97
++#define CLK_TIMER2			98
++#define CLK_TIMER3			99
++#define CLK_TIMER4			100
++#define CLK_TIMER5			101
++#define PCLK_JDBCK_DAP			102
++#define CLK_JDBCK_DAP			103
++#define PCLK_WDT_NS			104
++#define TCLK_WDT_NS			105
++#define HCLK_TRNG_NS			106
++#define PCLK_UART0			107
++#define PCLK_DMA2DDR			108
++#define ACLK_DMA2DDR			109
++#define PCLK_PWM0			110
++#define CLK_PWM0			111
++#define CLK_CAPTURE_PWM0		112
++#define PCLK_PWM1			113
++#define CLK_PWM1			114
++#define CLK_CAPTURE_PWM1		115
++#define PCLK_SCR			116
++#define ACLK_DCF			117
++#define PCLK_INTMUX			118
++#define CLK_PPLL_I			119
++#define CLK_PPLL_MUX			120
++#define CLK_PPLL_100M_MATRIX		121
++#define CLK_PPLL_50M_MATRIX		122
++#define CLK_REF_PCIE_INNER_PHY		123
++#define CLK_REF_PCIE_100M_PHY		124
++#define ACLK_VPU_L_ROOT			125
++#define CLK_GMAC1_VPU_25M		126
++#define CLK_PPLL_125M_MATRIX		127
++#define ACLK_VPU_ROOT			128
++#define HCLK_VPU_ROOT			129
++#define PCLK_VPU_ROOT			130
++#define ACLK_VPU_BIU			131
++#define HCLK_VPU_BIU			132
++#define PCLK_VPU_BIU			133
++#define ACLK_VPU			134
++#define HCLK_VPU			135
++#define PCLK_CRU_PCIE			136
++#define PCLK_VPU_GRF			137
++#define HCLK_SFC			138
++#define SCLK_SFC			139
++#define CCLK_SRC_EMMC			140
++#define HCLK_EMMC			141
++#define ACLK_EMMC			142
++#define BCLK_EMMC			143
++#define TCLK_EMMC			144
++#define PCLK_GPIO1			145
++#define DBCLK_GPIO1			146
++#define ACLK_VPU_L_BIU			147
++#define PCLK_VPU_IOC			148
++#define HCLK_SAI_I2S0			149
++#define MCLK_SAI_I2S0			150
++#define HCLK_SAI_I2S2			151
++#define MCLK_SAI_I2S2			152
++#define PCLK_ACODEC			153
++#define MCLK_ACODEC_TX			154
++#define PCLK_GPIO3			155
++#define DBCLK_GPIO3			156
++#define PCLK_SPI1			157
++#define CLK_SPI1			158
++#define SCLK_IN_SPI1			159
++#define PCLK_UART2			160
++#define PCLK_UART5			161
++#define PCLK_UART6			162
++#define PCLK_UART7			163
++#define PCLK_I2C3			164
++#define CLK_I2C3			165
++#define PCLK_I2C5			166
++#define CLK_I2C5			167
++#define PCLK_I2C6			168
++#define CLK_I2C6			169
++#define ACLK_MAC_VPU			170
++#define PCLK_MAC_VPU			171
++#define CLK_GMAC1_RMII_VPU		172
++#define CLK_GMAC1_SRC_VPU		173
++#define PCLK_PCIE			174
++#define CLK_PCIE_AUX			175
++#define ACLK_PCIE			176
++#define HCLK_PCIE_SLV			177
++#define HCLK_PCIE_DBI			178
++#define PCLK_PCIE_PHY			179
++#define PCLK_PIPE_GRF			180
++#define CLK_PIPE_USB3OTG_COMBO		181
++#define CLK_UTMI_USB3OTG		182
++#define CLK_PCIE_PIPE_PHY		183
++#define CCLK_SRC_SDIO0			184
++#define HCLK_SDIO0			185
++#define CCLK_SRC_SDIO1			186
++#define HCLK_SDIO1			187
++#define CLK_TS_0			188
++#define CLK_TS_1			189
++#define PCLK_CAN2			190
++#define CLK_CAN2			191
++#define PCLK_CAN3			192
++#define CLK_CAN3			193
++#define PCLK_SARADC			194
++#define CLK_SARADC			195
++#define PCLK_TSADC			196
++#define CLK_TSADC			197
++#define CLK_TSADC_TSEN			198
++#define ACLK_USB3OTG			199
++#define CLK_REF_USB3OTG			200
++#define CLK_SUSPEND_USB3OTG		201
++#define ACLK_GPU_ROOT			202
++#define PCLK_GPU_ROOT			203
++#define ACLK_GPU_BIU			204
++#define PCLK_GPU_BIU			205
++#define ACLK_GPU			206
++#define CLK_GPU_PVTPLL_SRC		207
++#define ACLK_GPU_MALI			208
++#define HCLK_RKVENC_ROOT		209
++#define ACLK_RKVENC_ROOT		210
++#define PCLK_RKVENC_ROOT		211
++#define HCLK_RKVENC_BIU			212
++#define ACLK_RKVENC_BIU			213
++#define PCLK_RKVENC_BIU			214
++#define HCLK_RKVENC			215
++#define ACLK_RKVENC			216
++#define CLK_CORE_RKVENC			217
++#define HCLK_SAI_I2S1			218
++#define MCLK_SAI_I2S1			219
++#define PCLK_I2C1			220
++#define CLK_I2C1			221
++#define PCLK_I2C0			222
++#define CLK_I2C0			223
++#define CLK_UART_JTAG			224
++#define PCLK_SPI0			225
++#define CLK_SPI0			226
++#define SCLK_IN_SPI0			227
++#define PCLK_GPIO4			228
++#define DBCLK_GPIO4			229
++#define PCLK_RKVENC_IOC			230
++#define HCLK_SPDIF			231
++#define MCLK_SPDIF			232
++#define HCLK_PDM			233
++#define MCLK_PDM			234
++#define PCLK_UART1			235
++#define PCLK_UART3			236
++#define PCLK_RKVENC_GRF			237
++#define PCLK_CAN0			238
++#define CLK_CAN0			239
++#define PCLK_CAN1			240
++#define CLK_CAN1			241
++#define ACLK_VO_ROOT			242
++#define HCLK_VO_ROOT			243
++#define PCLK_VO_ROOT			244
++#define ACLK_VO_BIU			245
++#define HCLK_VO_BIU			246
++#define PCLK_VO_BIU			247
++#define HCLK_RGA2E			248
++#define ACLK_RGA2E			249
++#define CLK_CORE_RGA2E			250
++#define HCLK_VDPP			251
++#define ACLK_VDPP			252
++#define CLK_CORE_VDPP			253
++#define PCLK_VO_GRF			254
++#define PCLK_CRU			255
++#define ACLK_VOP_ROOT			256
++#define ACLK_VOP_BIU			257
++#define HCLK_VOP			258
++#define DCLK_VOP0			259
++#define DCLK_VOP1			260
++#define ACLK_VOP			261
++#define PCLK_HDMI			262
++#define CLK_SFR_HDMI			263
++#define CLK_CEC_HDMI			264
++#define CLK_SPDIF_HDMI			265
++#define CLK_HDMIPHY_TMDSSRC		266
++#define CLK_HDMIPHY_PREP		267
++#define PCLK_HDMIPHY			268
++#define HCLK_HDCP_KEY			269
++#define ACLK_HDCP			270
++#define HCLK_HDCP			271
++#define PCLK_HDCP			272
++#define HCLK_CVBS			273
++#define DCLK_CVBS			274
++#define DCLK_4X_CVBS			275
++#define ACLK_JPEG_DECODER		276
++#define HCLK_JPEG_DECODER		277
++#define ACLK_VO_L_ROOT			278
++#define ACLK_VO_L_BIU			279
++#define ACLK_MAC_VO			280
++#define PCLK_MAC_VO			281
++#define CLK_GMAC0_SRC			282
++#define CLK_GMAC0_RMII_50M		283
++#define CLK_GMAC0_TX			284
++#define CLK_GMAC0_RX			285
++#define ACLK_JPEG_ROOT			286
++#define ACLK_JPEG_BIU			287
++#define HCLK_SAI_I2S3			288
++#define MCLK_SAI_I2S3			289
++#define CLK_MACPHY			290
++#define PCLK_VCDCPHY			291
++#define PCLK_GPIO2			292
++#define DBCLK_GPIO2			293
++#define PCLK_VO_IOC			294
++#define CCLK_SRC_SDMMC0			295
++#define HCLK_SDMMC0			296
++#define PCLK_OTPC_NS			297
++#define CLK_SBPI_OTPC_NS		298
++#define CLK_USER_OTPC_NS		299
++#define CLK_HDMIHDP0			300
++#define HCLK_USBHOST			301
++#define HCLK_USBHOST_ARB		302
++#define CLK_USBHOST_OHCI		303
++#define CLK_USBHOST_UTMI		304
++#define PCLK_UART4			305
++#define PCLK_I2C4			306
++#define CLK_I2C4			307
++#define PCLK_I2C7			308
++#define CLK_I2C7			309
++#define PCLK_USBPHY			310
++#define CLK_REF_USBPHY			311
++#define HCLK_RKVDEC_ROOT		312
++#define ACLK_RKVDEC_ROOT_NDFT		313
++#define PCLK_DDRPHY_CRU			314
++#define HCLK_RKVDEC_BIU			315
++#define ACLK_RKVDEC_BIU			316
++#define ACLK_RKVDEC			317
++#define HCLK_RKVDEC			318
++#define CLK_HEVC_CA_RKVDEC		319
++#define ACLK_RKVDEC_PVTMUX_ROOT		320
++#define CLK_RKVDEC_PVTPLL_SRC		321
++#define PCLK_DDR_ROOT			322
++#define PCLK_DDR_BIU			323
++#define PCLK_DDRC			324
++#define PCLK_DDRMON			325
++#define CLK_TIMER_DDRMON		326
++#define PCLK_MSCH_BIU			327
++#define PCLK_DDR_GRF			328
++#define PCLK_DDR_HWLP			329
++#define PCLK_DDRPHY			330
++#define CLK_MSCH_BIU			331
++#define ACLK_DDR_UPCTL			332
++#define CLK_DDR_UPCTL			333
++#define CLK_DDRMON			334
++#define ACLK_DDR_SCRAMBLE		335
++#define ACLK_SPLIT			336
++#define CLK_DDRC_SRC			337
++#define CLK_DDR_PHY			338
++#define PCLK_OTPC_S			339
++#define CLK_SBPI_OTPC_S			340
++#define CLK_USER_OTPC_S			341
++#define PCLK_KEYREADER			342
++#define PCLK_BUS_SGRF			343
++#define PCLK_STIMER			344
++#define CLK_STIMER0			345
++#define CLK_STIMER1			346
++#define PCLK_WDT_S			347
++#define TCLK_WDT_S			348
++#define HCLK_TRNG_S			349
++#define HCLK_BOOTROM			350
++#define PCLK_DCF			351
++#define ACLK_SYSMEM			352
++#define HCLK_TSP			353
++#define ACLK_TSP			354
++#define CLK_CORE_TSP			355
++#define CLK_OTPC_ARB			356
++#define PCLK_OTP_MASK			357
++#define CLK_PMC_OTP			358
++#define PCLK_PMU_ROOT			359
++#define HCLK_PMU_ROOT			360
++#define PCLK_I2C2			361
++#define CLK_I2C2			362
++#define HCLK_PMU_BIU			363
++#define PCLK_PMU_BIU			364
++#define FCLK_MCU			365
++#define RTC_CLK_MCU			366
++#define PCLK_OSCCHK			367
++#define CLK_PMU_MCU_JTAG		368
++#define PCLK_PMU			369
++#define PCLK_GPIO0			370
++#define DBCLK_GPIO0			371
++#define XIN_OSC0_DIV			372
++#define CLK_DEEPSLOW			373
++#define CLK_DDR_FAIL_SAFE		374
++#define PCLK_PMU_HP_TIMER		375
++#define CLK_PMU_HP_TIMER		376
++#define CLK_PMU_32K_HP_TIMER		377
++#define PCLK_PMU_IOC			378
++#define PCLK_PMU_CRU			379
++#define PCLK_PMU_GRF			380
++#define PCLK_PMU_WDT			381
++#define TCLK_PMU_WDT			382
++#define PCLK_PMU_MAILBOX		383
++#define PCLK_SCRKEYGEN			384
++#define CLK_SCRKEYGEN			385
++#define CLK_PVTM_OSCCHK			386
++#define CLK_REFOUT			387
++#define CLK_PVTM_PMU			388
++#define PCLK_PVTM_PMU			389
++#define PCLK_PMU_SGRF			390
++#define HCLK_PMU_SRAM			391
++#define CLK_UART0			392
++#define CLK_UART1			393
++#define CLK_UART2			394
++#define CLK_UART3			395
++#define CLK_UART4			396
++#define CLK_UART5			397
++#define CLK_UART6			398
++#define CLK_UART7			399
++#define MCLK_I2S0_2CH_SAI_SRC_PRE	400
++#define MCLK_I2S1_8CH_SAI_SRC_PRE	401
++#define MCLK_I2S2_2CH_SAI_SRC_PRE	402
++#define MCLK_I2S3_8CH_SAI_SRC_PRE	403
++#define MCLK_SDPDIF_SRC_PRE		404
++
++/* scmi-clocks indices */
++#define SCMI_PCLK_KEYREADER		0
++#define SCMI_HCLK_KLAD			1
++#define SCMI_PCLK_KLAD			2
++#define SCMI_HCLK_TRNG_S		3
++#define SCMI_HCLK_CRYPTO_S		4
++#define SCMI_PCLK_WDT_S			5
++#define SCMI_TCLK_WDT_S			6
++#define SCMI_PCLK_STIMER		7
++#define SCMI_CLK_STIMER0		8
++#define SCMI_CLK_STIMER1		9
++#define SCMI_PCLK_OTP_MASK		10
++#define SCMI_PCLK_OTPC_S		11
++#define SCMI_CLK_SBPI_OTPC_S		12
++#define SCMI_CLK_USER_OTPC_S		13
++#define SCMI_CLK_PMC_OTP		14
++#define SCMI_CLK_OTPC_ARB		15
++#define SCMI_CLK_CORE_TSP		16
++#define SCMI_ACLK_TSP			17
++#define SCMI_HCLK_TSP			18
++#define SCMI_PCLK_DCF			19
++#define SCMI_CLK_DDR			20
++#define SCMI_CLK_CPU			21
++#define SCMI_CLK_GPU			22
++#define SCMI_CORE_CRYPTO		23
++#define SCMI_ACLK_CRYPTO		24
++#define SCMI_PKA_CRYPTO			25
++#define SCMI_HCLK_CRYPTO		26
++#define SCMI_CORE_CRYPTO_S		27
++#define SCMI_ACLK_CRYPTO_S		28
++#define SCMI_PKA_CRYPTO_S		29
++#define SCMI_CORE_KLAD			30
++#define SCMI_ACLK_KLAD			31
++#define SCMI_HCLK_TRNG			32
++
++#endif // _DT_BINDINGS_CLK_ROCKCHIP_RK3528_H
+--- /dev/null
++++ b/include/dt-bindings/reset/rockchip,rk3528-cru.h
+@@ -0,0 +1,241 @@
++/* SPDX-License-Identifier: (GPL-2.0-only OR MIT) */
++/*
++ * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
++ * Copyright (c) 2024 Yao Zi <ziyao at disroot.org>
++ * Author: Joseph Chen <chenjh at rock-chips.com>
++ */
++
++#ifndef _DT_BINDINGS_RESET_ROCKCHIP_RK3528_H
++#define _DT_BINDINGS_RESET_ROCKCHIP_RK3528_H
++
++#define SRST_CORE0_PO		0
++#define SRST_CORE1_PO		1
++#define SRST_CORE2_PO		2
++#define SRST_CORE3_PO		3
++#define SRST_CORE0		4
++#define SRST_CORE1		5
++#define SRST_CORE2		6
++#define SRST_CORE3		7
++#define SRST_NL2		8
++#define SRST_CORE_BIU		9
++#define SRST_CORE_CRYPTO	10
++#define SRST_P_DBG		11
++#define SRST_POT_DBG		12
++#define SRST_NT_DBG		13
++#define SRST_P_CORE_GRF		14
++#define SRST_P_DAPLITE_BIU	15
++#define SRST_P_CPU_BIU		16
++#define SRST_REF_PVTPLL_CORE	17
++#define SRST_A_BUS_VOPGL_BIU	18
++#define SRST_A_BUS_H_BIU	19
++#define SRST_A_SYSMEM_BIU	20
++#define SRST_A_BUS_BIU		21
++#define SRST_H_BUS_BIU		22
++#define SRST_P_BUS_BIU		23
++#define SRST_P_DFT2APB		24
++#define SRST_P_BUS_GRF		25
++#define SRST_A_BUS_M_BIU	26
++#define SRST_A_GIC		27
++#define SRST_A_SPINLOCK		28
++#define SRST_A_DMAC		29
++#define SRST_P_TIMER		30
++#define SRST_TIMER0		31
++#define SRST_TIMER1		32
++#define SRST_TIMER2		33
++#define SRST_TIMER3		34
++#define SRST_TIMER4		35
++#define SRST_TIMER5		36
++#define SRST_P_JDBCK_DAP	37
++#define SRST_JDBCK_DAP		38
++#define SRST_P_WDT_NS		39
++#define SRST_T_WDT_NS		40
++#define SRST_H_TRNG_NS		41
++#define SRST_P_UART0		42
++#define SRST_S_UART0		43
++#define SRST_PKA_CRYPTO		44
++#define SRST_A_CRYPTO		45
++#define SRST_H_CRYPTO		46
++#define SRST_P_DMA2DDR		47
++#define SRST_A_DMA2DDR		48
++#define SRST_P_PWM0		49
++#define SRST_PWM0		50
++#define SRST_P_PWM1		51
++#define SRST_PWM1		52
++#define SRST_P_SCR		53
++#define SRST_A_DCF		54
++#define SRST_P_INTMUX		55
++#define SRST_A_VPU_BIU		56
++#define SRST_H_VPU_BIU		57
++#define SRST_P_VPU_BIU		58
++#define SRST_A_VPU		59
++#define SRST_H_VPU		60
++#define SRST_P_CRU_PCIE		61
++#define SRST_P_VPU_GRF		62
++#define SRST_H_SFC		63
++#define SRST_S_SFC		64
++#define SRST_C_EMMC		65
++#define SRST_H_EMMC		66
++#define SRST_A_EMMC		67
++#define SRST_B_EMMC		68
++#define SRST_T_EMMC		69
++#define SRST_P_GPIO1		70
++#define SRST_DB_GPIO1		71
++#define SRST_A_VPU_L_BIU	72
++#define SRST_P_VPU_IOC		73
++#define SRST_H_SAI_I2S0		74
++#define SRST_M_SAI_I2S0		75
++#define SRST_H_SAI_I2S2		76
++#define SRST_M_SAI_I2S2		77
++#define SRST_P_ACODEC		78
++#define SRST_P_GPIO3		79
++#define SRST_DB_GPIO3		80
++#define SRST_P_SPI1		81
++#define SRST_SPI1		82
++#define SRST_P_UART2		83
++#define SRST_S_UART2		84
++#define SRST_P_UART5		85
++#define SRST_S_UART5		86
++#define SRST_P_UART6		87
++#define SRST_S_UART6		88
++#define SRST_P_UART7		89
++#define SRST_S_UART7		90
++#define SRST_P_I2C3		91
++#define SRST_I2C3		92
++#define SRST_P_I2C5		93
++#define SRST_I2C5		94
++#define SRST_P_I2C6		95
++#define SRST_I2C6		96
++#define SRST_A_MAC		97
++#define SRST_P_PCIE		98
++#define SRST_PCIE_PIPE_PHY	99
++#define SRST_PCIE_POWER_UP	100
++#define SRST_P_PCIE_PHY		101
++#define SRST_P_PIPE_GRF		102
++#define SRST_H_SDIO0		103
++#define SRST_H_SDIO1		104
++#define SRST_TS_0		105
++#define SRST_TS_1		106
++#define SRST_P_CAN2		107
++#define SRST_CAN2		108
++#define SRST_P_CAN3		109
++#define SRST_CAN3		110
++#define SRST_P_SARADC		111
++#define SRST_SARADC		112
++#define SRST_SARADC_PHY		113
++#define SRST_P_TSADC		114
++#define SRST_TSADC		115
++#define SRST_A_USB3OTG		116
++#define SRST_A_GPU_BIU		117
++#define SRST_P_GPU_BIU		118
++#define SRST_A_GPU		119
++#define SRST_REF_PVTPLL_GPU	120
++#define SRST_H_RKVENC_BIU	121
++#define SRST_A_RKVENC_BIU	122
++#define SRST_P_RKVENC_BIU	123
++#define SRST_H_RKVENC		124
++#define SRST_A_RKVENC		125
++#define SRST_CORE_RKVENC	126
++#define SRST_H_SAI_I2S1		127
++#define SRST_M_SAI_I2S1		128
++#define SRST_P_I2C1		129
++#define SRST_I2C1		130
++#define SRST_P_I2C0		131
++#define SRST_I2C0		132
++#define SRST_P_SPI0		133
++#define SRST_SPI0		134
++#define SRST_P_GPIO4		135
++#define SRST_DB_GPIO4		136
++#define SRST_P_RKVENC_IOC	137
++#define SRST_H_SPDIF		138
++#define SRST_M_SPDIF		139
++#define SRST_H_PDM		140
++#define SRST_M_PDM		141
++#define SRST_P_UART1		142
++#define SRST_S_UART1		143
++#define SRST_P_UART3		144
++#define SRST_S_UART3		145
++#define SRST_P_RKVENC_GRF	146
++#define SRST_P_CAN0		147
++#define SRST_CAN0		148
++#define SRST_P_CAN1		149
++#define SRST_CAN1		150
++#define SRST_A_VO_BIU		151
++#define SRST_H_VO_BIU		152
++#define SRST_P_VO_BIU		153
++#define SRST_H_RGA2E		154
++#define SRST_A_RGA2E		155
++#define SRST_CORE_RGA2E		156
++#define SRST_H_VDPP		157
++#define SRST_A_VDPP		158
++#define SRST_CORE_VDPP		159
++#define SRST_P_VO_GRF		160
++#define SRST_P_CRU		161
++#define SRST_A_VOP_BIU		162
++#define SRST_H_VOP		163
++#define SRST_D_VOP0		164
++#define SRST_D_VOP1		165
++#define SRST_A_VOP		166
++#define SRST_P_HDMI		167
++#define SRST_HDMI		168
++#define SRST_P_HDMIPHY		169
++#define SRST_H_HDCP_KEY		170
++#define SRST_A_HDCP		171
++#define SRST_H_HDCP		172
++#define SRST_P_HDCP		173
++#define SRST_H_CVBS		174
++#define SRST_D_CVBS_VOP		175
++#define SRST_D_4X_CVBS_VOP	176
++#define SRST_A_JPEG_DECODER	177
++#define SRST_H_JPEG_DECODER	178
++#define SRST_A_VO_L_BIU		179
++#define SRST_A_MAC_VO		180
++#define SRST_A_JPEG_BIU		181
++#define SRST_H_SAI_I2S3		182
++#define SRST_M_SAI_I2S3		183
++#define SRST_MACPHY		184
++#define SRST_P_VCDCPHY		185
++#define SRST_P_GPIO2		186
++#define SRST_DB_GPIO2		187
++#define SRST_P_VO_IOC		188
++#define SRST_H_SDMMC0		189
++#define SRST_P_OTPC_NS		190
++#define SRST_SBPI_OTPC_NS	191
++#define SRST_USER_OTPC_NS	192
++#define SRST_HDMIHDP0		193
++#define SRST_H_USBHOST		194
++#define SRST_H_USBHOST_ARB	195
++#define SRST_HOST_UTMI		196
++#define SRST_P_UART4		197
++#define SRST_S_UART4		198
++#define SRST_P_I2C4		199
++#define SRST_I2C4		200
++#define SRST_P_I2C7		201
++#define SRST_I2C7		202
++#define SRST_P_USBPHY		203
++#define SRST_USBPHY_POR		204
++#define SRST_USBPHY_OTG		205
++#define SRST_USBPHY_HOST	206
++#define SRST_P_DDRPHY_CRU	207
++#define SRST_H_RKVDEC_BIU	208
++#define SRST_A_RKVDEC_BIU	209
++#define SRST_A_RKVDEC		210
++#define SRST_H_RKVDEC		211
++#define SRST_HEVC_CA_RKVDEC	212
++#define SRST_REF_PVTPLL_RKVDEC	213
++#define SRST_P_DDR_BIU		214
++#define SRST_P_DDRC		215
++#define SRST_P_DDRMON		216
++#define SRST_TIMER_DDRMON	217
++#define SRST_P_MSCH_BIU		218
++#define SRST_P_DDR_GRF		219
++#define SRST_P_DDR_HWLP		220
++#define SRST_P_DDRPHY		221
++#define SRST_MSCH_BIU		222
++#define SRST_A_DDR_UPCTL	223
++#define SRST_DDR_UPCTL		224
++#define SRST_DDRMON		225
++#define SRST_A_DDR_SCRAMBLE	226
++#define SRST_A_SPLIT		227
++#define SRST_DDR_PHY		228
++
++#endif // _DT_BINDINGS_RESET_ROCKCHIP_RK3528_H
diff --git a/target/linux/rockchip/patches-6.12/032-19-v6.15-clk-rockchip-Add-PLL-flag-ROCKCHIP_PLL_FIXED_MODE.patch b/target/linux/rockchip/patches-6.12/032-19-v6.15-clk-rockchip-Add-PLL-flag-ROCKCHIP_PLL_FIXED_MODE.patch
new file mode 100644
index 0000000000..59e08aa1d6
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/032-19-v6.15-clk-rockchip-Add-PLL-flag-ROCKCHIP_PLL_FIXED_MODE.patch
@@ -0,0 +1,54 @@
+From 651aabc9fb0f354ad2ba5fd06a6011e652447489 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Mon, 17 Feb 2025 06:11:43 +0000
+Subject: [PATCH] clk: rockchip: Add PLL flag ROCKCHIP_PLL_FIXED_MODE
+
+RK3528 comes with a new PLL variant: its "PPLL", which mainly generates
+clocks for the PCIe controller, operates in normal mode only. Let's
+describe it with flag ROCKCHIP_PLL_FIXED_MODE and handle it in code.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Link: https://lore.kernel.org/r/20250217061142.38480-7-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ drivers/clk/rockchip/clk-pll.c | 10 ++++++----
+ drivers/clk/rockchip/clk.h     |  2 ++
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+--- a/drivers/clk/rockchip/clk-pll.c
++++ b/drivers/clk/rockchip/clk-pll.c
+@@ -204,10 +204,12 @@ static int rockchip_rk3036_pll_set_param
+ 	rockchip_rk3036_pll_get_params(pll, &cur);
+ 	cur.rate = 0;
+ 
+-	cur_parent = pll_mux_ops->get_parent(&pll_mux->hw);
+-	if (cur_parent == PLL_MODE_NORM) {
+-		pll_mux_ops->set_parent(&pll_mux->hw, PLL_MODE_SLOW);
+-		rate_change_remuxed = 1;
++	if (!(pll->flags & ROCKCHIP_PLL_FIXED_MODE)) {
++		cur_parent = pll_mux_ops->get_parent(&pll_mux->hw);
++		if (cur_parent == PLL_MODE_NORM) {
++			pll_mux_ops->set_parent(&pll_mux->hw, PLL_MODE_SLOW);
++			rate_change_remuxed = 1;
++		}
+ 	}
+ 
+ 	/* update pll values */
+--- a/drivers/clk/rockchip/clk.h
++++ b/drivers/clk/rockchip/clk.h
+@@ -469,6 +469,7 @@ struct rockchip_pll_rate_table {
+  * Flags:
+  * ROCKCHIP_PLL_SYNC_RATE - check rate parameters to match against the
+  *	rate_table parameters and ajust them if necessary.
++ * ROCKCHIP_PLL_FIXED_MODE - the pll operates in normal mode only
+  */
+ struct rockchip_pll_clock {
+ 	unsigned int		id;
+@@ -486,6 +487,7 @@ struct rockchip_pll_clock {
+ };
+ 
+ #define ROCKCHIP_PLL_SYNC_RATE		BIT(0)
++#define ROCKCHIP_PLL_FIXED_MODE		BIT(1)
+ 
+ #define PLL(_type, _id, _name, _pnames, _flags, _con, _mode, _mshift,	\
+ 		_lshift, _pflags, _rtable)				\
diff --git a/target/linux/rockchip/patches-6.12/032-20-v6.15-clk-rockchip-Add-clock-controller-driver-for-RK3528-SoC.patch b/target/linux/rockchip/patches-6.12/032-20-v6.15-clk-rockchip-Add-clock-controller-driver-for-RK3528-SoC.patch
new file mode 100644
index 0000000000..b69acb76f6
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/032-20-v6.15-clk-rockchip-Add-clock-controller-driver-for-RK3528-SoC.patch
@@ -0,0 +1,1193 @@
+From 5d0eb375e6857d270f6376d161ef02a1b7183fa2 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Mon, 17 Feb 2025 06:11:44 +0000
+Subject: [PATCH] clk: rockchip: Add clock controller driver for RK3528 SoC
+
+Add clock tree definition for RK3528. Similar to previous Rockchip
+SoCs, clock controller of RK3528 is combined with the reset controller.
+We omit the reset part for now since it's hard to test it without
+support for other basic peripherals.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Link: https://lore.kernel.org/r/20250217061142.38480-8-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ drivers/clk/rockchip/Kconfig      |    7 +
+ drivers/clk/rockchip/Makefile     |    1 +
+ drivers/clk/rockchip/clk-rk3528.c | 1114 +++++++++++++++++++++++++++++
+ drivers/clk/rockchip/clk.h        |   20 +
+ 4 files changed, 1142 insertions(+)
+ create mode 100644 drivers/clk/rockchip/clk-rk3528.c
+
+--- a/drivers/clk/rockchip/Kconfig
++++ b/drivers/clk/rockchip/Kconfig
+@@ -93,6 +93,13 @@ config CLK_RK3399
+ 	help
+ 	  Build the driver for RK3399 Clock Driver.
+ 
++config CLK_RK3528
++	bool "Rockchip RK3528 clock controller support"
++	depends on ARM64 || COMPILE_TEST
++	default y
++	help
++	  Build the driver for RK3528 Clock Controller.
++
+ config CLK_RK3568
+ 	bool "Rockchip RK3568 clock controller support"
+ 	depends on ARM64 || COMPILE_TEST
+--- a/drivers/clk/rockchip/Makefile
++++ b/drivers/clk/rockchip/Makefile
+@@ -29,6 +29,7 @@ obj-$(CONFIG_CLK_RK3308)        += clk-r
+ obj-$(CONFIG_CLK_RK3328)        += clk-rk3328.o
+ obj-$(CONFIG_CLK_RK3368)        += clk-rk3368.o
+ obj-$(CONFIG_CLK_RK3399)        += clk-rk3399.o
++obj-$(CONFIG_CLK_RK3528)	+= clk-rk3528.o
+ obj-$(CONFIG_CLK_RK3568)	+= clk-rk3568.o
+ obj-$(CONFIG_CLK_RK3576)	+= clk-rk3576.o rst-rk3576.o
+ obj-$(CONFIG_CLK_RK3588)	+= clk-rk3588.o rst-rk3588.o
+--- /dev/null
++++ b/drivers/clk/rockchip/clk-rk3528.c
+@@ -0,0 +1,1114 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
++ * Copyright (c) 2024 Yao Zi <ziyao at disroot.org>
++ * Author: Joseph Chen <chenjh at rock-chips.com>
++ */
++
++#include <linux/clk-provider.h>
++#include <linux/module.h>
++#include <linux/of.h>
++#include <linux/of_device.h>
++#include <linux/platform_device.h>
++
++#include <dt-bindings/clock/rockchip,rk3528-cru.h>
++
++#include "clk.h"
++
++#define RK3528_GRF_SOC_STATUS0		0x1a0
++
++enum rk3528_plls {
++	apll, cpll, gpll, ppll, dpll,
++};
++
++static struct rockchip_pll_rate_table rk3528_pll_rates[] = {
++	RK3036_PLL_RATE(1896000000, 1, 79, 1, 1, 1, 0),
++	RK3036_PLL_RATE(1800000000, 1, 75, 1, 1, 1, 0),
++	RK3036_PLL_RATE(1704000000, 1, 71, 1, 1, 1, 0),
++	RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0),
++	RK3036_PLL_RATE(1512000000, 1, 63, 1, 1, 1, 0),
++	RK3036_PLL_RATE(1416000000, 1, 59, 1, 1, 1, 0),
++	RK3036_PLL_RATE(1296000000, 1, 54, 1, 1, 1, 0),
++	RK3036_PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0),
++	RK3036_PLL_RATE(1188000000, 1, 99, 2, 1, 1, 0),		/* GPLL */
++	RK3036_PLL_RATE(1092000000, 2, 91, 1, 1, 1, 0),
++	RK3036_PLL_RATE(1008000000, 1, 42, 1, 1, 1, 0),
++	RK3036_PLL_RATE(1000000000, 1, 125, 3, 1, 1, 0),	/* PPLL */
++	RK3036_PLL_RATE(996000000, 2, 83, 1, 1, 1, 0),		/* CPLL */
++	RK3036_PLL_RATE(960000000, 1, 40, 1, 1, 1, 0),
++	RK3036_PLL_RATE(912000000, 1, 76, 2, 1, 1, 0),
++	RK3036_PLL_RATE(816000000, 1, 68, 2, 1, 1, 0),
++	RK3036_PLL_RATE(600000000, 1, 50, 2, 1, 1, 0),
++	RK3036_PLL_RATE(594000000, 2, 99, 2, 1, 1, 0),
++	RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0),
++	RK3036_PLL_RATE(312000000, 1, 78, 6, 1, 1, 0),
++	RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0),
++	RK3036_PLL_RATE(96000000, 1, 24, 3, 2, 1, 0),
++	{ /* sentinel */ },
++};
++
++#define RK3528_DIV_ACLK_M_CORE_MASK	0x1f
++#define RK3528_DIV_ACLK_M_CORE_SHIFT	11
++#define RK3528_DIV_PCLK_DBG_MASK	0x1f
++#define RK3528_DIV_PCLK_DBG_SHIFT	1
++
++#define RK3528_CLKSEL39(_aclk_m_core)					\
++{									\
++	.reg = RK3528_CLKSEL_CON(39),					\
++	.val = HIWORD_UPDATE(_aclk_m_core, RK3528_DIV_ACLK_M_CORE_MASK,	\
++			     RK3528_DIV_ACLK_M_CORE_SHIFT),		\
++}
++
++#define RK3528_CLKSEL40(_pclk_dbg)					\
++{									\
++	.reg = RK3528_CLKSEL_CON(40),					\
++	.val = HIWORD_UPDATE(_pclk_dbg, RK3528_DIV_PCLK_DBG_MASK,	\
++			     RK3528_DIV_PCLK_DBG_SHIFT),		\
++}
++
++#define RK3528_CPUCLK_RATE(_prate, _aclk_m_core, _pclk_dbg)		\
++{									\
++	.prate = _prate,						\
++	.divs = {							\
++		RK3528_CLKSEL39(_aclk_m_core),				\
++		RK3528_CLKSEL40(_pclk_dbg),				\
++	},								\
++}
++
++static struct rockchip_cpuclk_rate_table rk3528_cpuclk_rates[] __initdata = {
++	RK3528_CPUCLK_RATE(1896000000, 1, 13),
++	RK3528_CPUCLK_RATE(1800000000, 1, 12),
++	RK3528_CPUCLK_RATE(1704000000, 1, 11),
++	RK3528_CPUCLK_RATE(1608000000, 1, 11),
++	RK3528_CPUCLK_RATE(1512000000, 1, 11),
++	RK3528_CPUCLK_RATE(1416000000, 1, 9),
++	RK3528_CPUCLK_RATE(1296000000, 1, 8),
++	RK3528_CPUCLK_RATE(1200000000, 1, 8),
++	RK3528_CPUCLK_RATE(1188000000, 1, 8),
++	RK3528_CPUCLK_RATE(1092000000, 1, 7),
++	RK3528_CPUCLK_RATE(1008000000, 1, 6),
++	RK3528_CPUCLK_RATE(1000000000, 1, 6),
++	RK3528_CPUCLK_RATE(996000000, 1, 6),
++	RK3528_CPUCLK_RATE(960000000, 1, 6),
++	RK3528_CPUCLK_RATE(912000000, 1, 6),
++	RK3528_CPUCLK_RATE(816000000, 1, 5),
++	RK3528_CPUCLK_RATE(600000000, 1, 3),
++	RK3528_CPUCLK_RATE(594000000, 1, 3),
++	RK3528_CPUCLK_RATE(408000000, 1, 2),
++	RK3528_CPUCLK_RATE(312000000, 1, 2),
++	RK3528_CPUCLK_RATE(216000000, 1, 1),
++	RK3528_CPUCLK_RATE(96000000, 1, 0),
++};
++
++static const struct rockchip_cpuclk_reg_data rk3528_cpuclk_data = {
++	.core_reg[0] = RK3528_CLKSEL_CON(39),
++	.div_core_shift[0] = 5,
++	.div_core_mask[0] = 0x1f,
++	.num_cores = 1,
++	.mux_core_alt = 1,
++	.mux_core_main = 0,
++	.mux_core_shift = 10,
++	.mux_core_mask = 0x1,
++};
++
++PNAME(mux_pll_p)                        = { "xin24m" };
++PNAME(mux_armclk)			= { "apll", "gpll" };
++PNAME(mux_24m_32k_p)                    = { "xin24m", "clk_32k" };
++PNAME(mux_gpll_cpll_p)                  = { "gpll", "cpll" };
++PNAME(mux_gpll_cpll_xin24m_p)           = { "gpll", "cpll", "xin24m" };
++PNAME(mux_100m_50m_24m_p)               = { "clk_100m_src", "clk_50m_src",
++					    "xin24m" };
++PNAME(mux_150m_100m_24m_p)              = { "clk_150m_src", "clk_100m_src",
++					    "xin24m" };
++PNAME(mux_200m_100m_24m_p)              = { "clk_200m_src", "clk_100m_src",
++					    "xin24m" };
++PNAME(mux_200m_100m_50m_24m_p)          = { "clk_200m_src", "clk_100m_src",
++					    "clk_50m_src", "xin24m" };
++PNAME(mux_300m_200m_100m_24m_p)         = { "clk_300m_src", "clk_200m_src",
++					    "clk_100m_src", "xin24m" };
++PNAME(mux_339m_200m_100m_24m_p)         = { "clk_339m_src", "clk_200m_src",
++					    "clk_100m_src", "xin24m" };
++PNAME(mux_500m_200m_100m_24m_p)         = { "clk_500m_src", "clk_200m_src",
++					    "clk_100m_src", "xin24m" };
++PNAME(mux_500m_300m_100m_24m_p)         = { "clk_500m_src", "clk_300m_src",
++					    "clk_100m_src", "xin24m" };
++PNAME(mux_600m_300m_200m_24m_p)         = { "clk_600m_src", "clk_300m_src",
++					    "clk_200m_src", "xin24m" };
++PNAME(aclk_gpu_p)                       = { "aclk_gpu_root",
++					    "clk_gpu_pvtpll_src" };
++PNAME(aclk_rkvdec_pvtmux_root_p)        = { "aclk_rkvdec_root",
++					    "clk_rkvdec_pvtpll_src" };
++PNAME(clk_i2c2_p)                       = { "clk_200m_src", "clk_100m_src",
++					    "xin24m", "clk_32k" };
++PNAME(clk_ref_pcie_inner_phy_p)         = { "clk_ppll_100m_src", "xin24m" };
++PNAME(dclk_vop0_p)                      = { "dclk_vop_src0",
++					    "clk_hdmiphy_pixel_io" };
++PNAME(mclk_i2s0_2ch_sai_src_p)          = { "clk_i2s0_2ch_src",
++					    "clk_i2s0_2ch_frac", "xin12m" };
++PNAME(mclk_i2s1_8ch_sai_src_p)          = { "clk_i2s1_8ch_src",
++					    "clk_i2s1_8ch_frac", "xin12m" };
++PNAME(mclk_i2s2_2ch_sai_src_p)          = { "clk_i2s2_2ch_src",
++					    "clk_i2s2_2ch_frac", "xin12m" };
++PNAME(mclk_i2s3_8ch_sai_src_p)          = { "clk_i2s3_8ch_src",
++					    "clk_i2s3_8ch_frac", "xin12m" };
++PNAME(mclk_sai_i2s0_p)                  = { "mclk_i2s0_2ch_sai_src",
++					    "i2s0_mclkin" };
++PNAME(mclk_sai_i2s1_p)                  = { "mclk_i2s1_8ch_sai_src",
++					    "i2s1_mclkin" };
++PNAME(mclk_spdif_src_p)                 = { "clk_spdif_src", "clk_spdif_frac",
++					    "xin12m" };
++PNAME(sclk_uart0_src_p)                 = { "clk_uart0_src", "clk_uart0_frac",
++					    "xin24m" };
++PNAME(sclk_uart1_src_p)                 = { "clk_uart1_src", "clk_uart1_frac",
++					    "xin24m" };
++PNAME(sclk_uart2_src_p)                 = { "clk_uart2_src", "clk_uart2_frac",
++					    "xin24m" };
++PNAME(sclk_uart3_src_p)                 = { "clk_uart3_src", "clk_uart3_frac",
++					    "xin24m" };
++PNAME(sclk_uart4_src_p)                 = { "clk_uart4_src", "clk_uart4_frac",
++					    "xin24m" };
++PNAME(sclk_uart5_src_p)                 = { "clk_uart5_src", "clk_uart5_frac",
++					    "xin24m" };
++PNAME(sclk_uart6_src_p)                 = { "clk_uart6_src", "clk_uart6_frac",
++					     "xin24m" };
++PNAME(sclk_uart7_src_p)                 = { "clk_uart7_src", "clk_uart7_frac",
++					    "xin24m" };
++PNAME(clk_32k_p)                        = { "xin_osc0_div", "clk_pvtm_32k" };
++
++static struct rockchip_pll_clock rk3528_pll_clks[] __initdata = {
++	[apll] = PLL(pll_rk3328, PLL_APLL, "apll", mux_pll_p,
++			CLK_IS_CRITICAL, RK3528_PLL_CON(0),
++			RK3528_MODE_CON, 0, 0, 0, rk3528_pll_rates),
++
++	[cpll] = PLL(pll_rk3328, PLL_CPLL, "cpll", mux_pll_p,
++			CLK_IS_CRITICAL, RK3528_PLL_CON(8),
++			RK3528_MODE_CON, 2, 0, 0, rk3528_pll_rates),
++
++	[gpll] = PLL(pll_rk3328, PLL_GPLL, "gpll", mux_pll_p,
++			CLK_IS_CRITICAL, RK3528_PLL_CON(24),
++			RK3528_MODE_CON, 4, 0, 0, rk3528_pll_rates),
++
++	[ppll] = PLL(pll_rk3328, PLL_PPLL, "ppll", mux_pll_p,
++			CLK_IS_CRITICAL, RK3528_PCIE_PLL_CON(32),
++			RK3528_MODE_CON, 6, 0, ROCKCHIP_PLL_FIXED_MODE, rk3528_pll_rates),
++
++	[dpll] = PLL(pll_rk3328, PLL_DPLL, "dpll", mux_pll_p,
++			CLK_IGNORE_UNUSED, RK3528_DDRPHY_PLL_CON(16),
++			RK3528_DDRPHY_MODE_CON, 0, 0, 0, rk3528_pll_rates),
++};
++
++#define MFLAGS CLK_MUX_HIWORD_MASK
++#define DFLAGS CLK_DIVIDER_HIWORD_MASK
++#define GFLAGS (CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE)
++
++static struct rockchip_clk_branch rk3528_uart0_fracmux __initdata =
++	MUX(CLK_UART0, "clk_uart0", sclk_uart0_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(6), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch rk3528_uart1_fracmux __initdata =
++	MUX(CLK_UART1, "clk_uart1", sclk_uart1_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(8), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch rk3528_uart2_fracmux __initdata =
++	MUX(CLK_UART2, "clk_uart2", sclk_uart2_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(10), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch rk3528_uart3_fracmux __initdata =
++	MUX(CLK_UART3, "clk_uart3", sclk_uart3_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(12), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch rk3528_uart4_fracmux __initdata =
++	MUX(CLK_UART4, "clk_uart4", sclk_uart4_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(14), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch rk3528_uart5_fracmux __initdata =
++	MUX(CLK_UART5, "clk_uart5", sclk_uart5_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(16), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch rk3528_uart6_fracmux __initdata =
++	MUX(CLK_UART6, "clk_uart6", sclk_uart6_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(18), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch rk3528_uart7_fracmux __initdata =
++	MUX(CLK_UART7, "clk_uart7", sclk_uart7_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(20), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch mclk_i2s0_2ch_sai_src_fracmux __initdata =
++	MUX(MCLK_I2S0_2CH_SAI_SRC_PRE, "mclk_i2s0_2ch_sai_src_pre", mclk_i2s0_2ch_sai_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(22), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch mclk_i2s1_8ch_sai_src_fracmux __initdata =
++	MUX(MCLK_I2S1_8CH_SAI_SRC_PRE, "mclk_i2s1_8ch_sai_src_pre", mclk_i2s1_8ch_sai_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(26), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch mclk_i2s2_2ch_sai_src_fracmux __initdata =
++	MUX(MCLK_I2S2_2CH_SAI_SRC_PRE, "mclk_i2s2_2ch_sai_src_pre", mclk_i2s2_2ch_sai_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(28), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch mclk_i2s3_8ch_sai_src_fracmux __initdata =
++	MUX(MCLK_I2S3_8CH_SAI_SRC_PRE, "mclk_i2s3_8ch_sai_src_pre", mclk_i2s3_8ch_sai_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(24), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch mclk_spdif_src_fracmux __initdata =
++	MUX(MCLK_SDPDIF_SRC_PRE, "mclk_spdif_src_pre", mclk_spdif_src_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(32), 0, 2, MFLAGS);
++
++static struct rockchip_clk_branch rk3528_clk_branches[] __initdata = {
++	/* top */
++	FACTOR(0, "xin12m", "xin24m", 0, 1, 2),
++
++	COMPOSITE(CLK_MATRIX_250M_SRC, "clk_250m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(1), 15, 1, MFLAGS, 10, 5, DFLAGS,
++			RK3528_CLKGATE_CON(0), 5, GFLAGS),
++	COMPOSITE(CLK_MATRIX_500M_SRC, "clk_500m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(3), 11, 1, MFLAGS, 6, 5, DFLAGS,
++			RK3528_CLKGATE_CON(0), 10, GFLAGS),
++	COMPOSITE_NOMUX(CLK_MATRIX_50M_SRC, "clk_50m_src", "cpll", CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(0), 2, 5, DFLAGS,
++			RK3528_CLKGATE_CON(0), 1, GFLAGS),
++	COMPOSITE_NOMUX(CLK_MATRIX_100M_SRC, "clk_100m_src", "cpll", CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(0), 7, 5, DFLAGS,
++			RK3528_CLKGATE_CON(0), 2, GFLAGS),
++	COMPOSITE_NOMUX(CLK_MATRIX_150M_SRC, "clk_150m_src", "gpll", CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(1), 0, 5, DFLAGS,
++			RK3528_CLKGATE_CON(0), 3, GFLAGS),
++	COMPOSITE_NOMUX(CLK_MATRIX_200M_SRC, "clk_200m_src", "gpll", CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(1), 5, 5, DFLAGS,
++			RK3528_CLKGATE_CON(0), 4, GFLAGS),
++	COMPOSITE_NOMUX(CLK_MATRIX_300M_SRC, "clk_300m_src", "gpll", CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(2), 0, 5, DFLAGS,
++			RK3528_CLKGATE_CON(0), 6, GFLAGS),
++	COMPOSITE_NOMUX_HALFDIV(CLK_MATRIX_339M_SRC, "clk_339m_src", "gpll", CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(2), 5, 5, DFLAGS,
++			RK3528_CLKGATE_CON(0), 7, GFLAGS),
++	COMPOSITE_NOMUX(CLK_MATRIX_400M_SRC, "clk_400m_src", "gpll", CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(2), 10, 5, DFLAGS,
++			RK3528_CLKGATE_CON(0), 8, GFLAGS),
++	COMPOSITE_NOMUX(CLK_MATRIX_600M_SRC, "clk_600m_src", "gpll", CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(4), 0, 5, DFLAGS,
++			RK3528_CLKGATE_CON(0), 11, GFLAGS),
++	COMPOSITE(DCLK_VOP_SRC0, "dclk_vop_src0", mux_gpll_cpll_p, 0,
++			RK3528_CLKSEL_CON(32), 10, 1, MFLAGS, 2, 8, DFLAGS,
++			RK3528_CLKGATE_CON(3), 7, GFLAGS),
++	COMPOSITE(DCLK_VOP_SRC1, "dclk_vop_src1", mux_gpll_cpll_p, 0,
++			RK3528_CLKSEL_CON(33), 8, 1, MFLAGS, 0, 8, DFLAGS,
++			RK3528_CLKGATE_CON(3), 8, GFLAGS),
++	COMPOSITE_NOMUX(CLK_HSM, "clk_hsm", "xin24m", 0,
++			RK3528_CLKSEL_CON(36), 5, 5, DFLAGS,
++			RK3528_CLKGATE_CON(3), 13, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_UART0_SRC, "clk_uart0_src", "gpll", 0,
++			RK3528_CLKSEL_CON(4), 5, 5, DFLAGS,
++			RK3528_CLKGATE_CON(0), 12, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_UART0_FRAC, "clk_uart0_frac", "clk_uart0_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(5), 0,
++			RK3528_CLKGATE_CON(0), 13, GFLAGS,
++			&rk3528_uart0_fracmux),
++	GATE(SCLK_UART0, "sclk_uart0", "clk_uart0", 0,
++			RK3528_CLKGATE_CON(0), 14, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_UART1_SRC, "clk_uart1_src", "gpll", 0,
++			RK3528_CLKSEL_CON(6), 2, 5, DFLAGS,
++			RK3528_CLKGATE_CON(0), 15, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_UART1_FRAC, "clk_uart1_frac", "clk_uart1_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(7), 0,
++			RK3528_CLKGATE_CON(1), 0, GFLAGS,
++			&rk3528_uart1_fracmux),
++	GATE(SCLK_UART1, "sclk_uart1", "clk_uart1", 0,
++			RK3528_CLKGATE_CON(1), 1, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_UART2_SRC, "clk_uart2_src", "gpll", 0,
++			RK3528_CLKSEL_CON(8), 2, 5, DFLAGS,
++			RK3528_CLKGATE_CON(1), 2, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_UART2_FRAC, "clk_uart2_frac", "clk_uart2_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(9), 0,
++			RK3528_CLKGATE_CON(1), 3, GFLAGS,
++			&rk3528_uart2_fracmux),
++	GATE(SCLK_UART2, "sclk_uart2", "clk_uart2", 0,
++			RK3528_CLKGATE_CON(1), 4, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_UART3_SRC, "clk_uart3_src", "gpll", 0,
++			RK3528_CLKSEL_CON(10), 2, 5, DFLAGS,
++			RK3528_CLKGATE_CON(1), 5, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_UART3_FRAC, "clk_uart3_frac", "clk_uart3_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(11), 0,
++			RK3528_CLKGATE_CON(1), 6, GFLAGS,
++			&rk3528_uart3_fracmux),
++	GATE(SCLK_UART3, "sclk_uart3", "clk_uart3", 0,
++			RK3528_CLKGATE_CON(1), 7, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_UART4_SRC, "clk_uart4_src", "gpll", 0,
++			RK3528_CLKSEL_CON(12), 2, 5, DFLAGS,
++			RK3528_CLKGATE_CON(1), 8, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_UART4_FRAC, "clk_uart4_frac", "clk_uart4_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(13), 0,
++			RK3528_CLKGATE_CON(1), 9, GFLAGS,
++			&rk3528_uart4_fracmux),
++	GATE(SCLK_UART4, "sclk_uart4", "clk_uart4", 0,
++			RK3528_CLKGATE_CON(1), 10, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_UART5_SRC, "clk_uart5_src", "gpll", 0,
++			RK3528_CLKSEL_CON(14), 2, 5, DFLAGS,
++			RK3528_CLKGATE_CON(1), 11, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_UART5_FRAC, "clk_uart5_frac", "clk_uart5_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(15), 0,
++			RK3528_CLKGATE_CON(1), 12, GFLAGS,
++			&rk3528_uart5_fracmux),
++	GATE(SCLK_UART5, "sclk_uart5", "clk_uart5", 0,
++			RK3528_CLKGATE_CON(1), 13, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_UART6_SRC, "clk_uart6_src", "gpll", 0,
++			RK3528_CLKSEL_CON(16), 2, 5, DFLAGS,
++			RK3528_CLKGATE_CON(1), 14, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_UART6_FRAC, "clk_uart6_frac", "clk_uart6_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(17), 0,
++			RK3528_CLKGATE_CON(1), 15, GFLAGS,
++			&rk3528_uart6_fracmux),
++	GATE(SCLK_UART6, "sclk_uart6", "clk_uart6", 0,
++			RK3528_CLKGATE_CON(2), 0, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_UART7_SRC, "clk_uart7_src", "gpll", 0,
++			RK3528_CLKSEL_CON(18), 2, 5, DFLAGS,
++			RK3528_CLKGATE_CON(2), 1, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_UART7_FRAC, "clk_uart7_frac", "clk_uart7_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(19), 0,
++			RK3528_CLKGATE_CON(2), 2, GFLAGS,
++			&rk3528_uart7_fracmux),
++	GATE(SCLK_UART7, "sclk_uart7", "clk_uart7", 0,
++			RK3528_CLKGATE_CON(2), 3, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_I2S0_2CH_SRC, "clk_i2s0_2ch_src", "gpll", 0,
++			RK3528_CLKSEL_CON(20), 8, 5, DFLAGS,
++			RK3528_CLKGATE_CON(2), 5, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_I2S0_2CH_FRAC, "clk_i2s0_2ch_frac", "clk_i2s0_2ch_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(21), 0,
++			RK3528_CLKGATE_CON(2), 6, GFLAGS,
++			&mclk_i2s0_2ch_sai_src_fracmux),
++	GATE(MCLK_I2S0_2CH_SAI_SRC, "mclk_i2s0_2ch_sai_src", "mclk_i2s0_2ch_sai_src_pre", 0,
++			RK3528_CLKGATE_CON(2), 7, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_I2S1_8CH_SRC, "clk_i2s1_8ch_src", "gpll", 0,
++			RK3528_CLKSEL_CON(24), 3, 5, DFLAGS,
++			RK3528_CLKGATE_CON(2), 11, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_I2S1_8CH_FRAC, "clk_i2s1_8ch_frac", "clk_i2s1_8ch_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(25), 0,
++			RK3528_CLKGATE_CON(2), 12, GFLAGS,
++			&mclk_i2s1_8ch_sai_src_fracmux),
++	GATE(MCLK_I2S1_8CH_SAI_SRC, "mclk_i2s1_8ch_sai_src", "mclk_i2s1_8ch_sai_src_pre", 0,
++			RK3528_CLKGATE_CON(2), 13, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_I2S2_2CH_SRC, "clk_i2s2_2ch_src", "gpll", 0,
++			RK3528_CLKSEL_CON(26), 3, 5, DFLAGS,
++			RK3528_CLKGATE_CON(2), 14, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_I2S2_2CH_FRAC, "clk_i2s2_2ch_frac", "clk_i2s2_2ch_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(27), 0,
++			RK3528_CLKGATE_CON(2), 15, GFLAGS,
++			&mclk_i2s2_2ch_sai_src_fracmux),
++	GATE(MCLK_I2S2_2CH_SAI_SRC, "mclk_i2s2_2ch_sai_src", "mclk_i2s2_2ch_sai_src_pre", 0,
++			RK3528_CLKGATE_CON(3), 0, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_I2S3_8CH_SRC, "clk_i2s3_8ch_src", "gpll", 0,
++			RK3528_CLKSEL_CON(22), 3, 5, DFLAGS,
++			RK3528_CLKGATE_CON(2), 8, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_I2S3_8CH_FRAC, "clk_i2s3_8ch_frac", "clk_i2s3_8ch_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(23), 0,
++			RK3528_CLKGATE_CON(2), 9, GFLAGS,
++			&mclk_i2s3_8ch_sai_src_fracmux),
++	GATE(MCLK_I2S3_8CH_SAI_SRC, "mclk_i2s3_8ch_sai_src", "mclk_i2s3_8ch_sai_src_pre", 0,
++			RK3528_CLKGATE_CON(2), 10, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_SPDIF_SRC, "clk_spdif_src", "gpll", 0,
++			RK3528_CLKSEL_CON(30), 2, 5, DFLAGS,
++			RK3528_CLKGATE_CON(3), 4, GFLAGS),
++	COMPOSITE_FRACMUX(CLK_SPDIF_FRAC, "clk_spdif_frac", "clk_spdif_src", CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(31), 0,
++			RK3528_CLKGATE_CON(3), 5, GFLAGS,
++			&mclk_spdif_src_fracmux),
++	GATE(MCLK_SPDIF_SRC, "mclk_spdif_src", "mclk_spdif_src_pre", 0,
++			RK3528_CLKGATE_CON(3), 6, GFLAGS),
++
++	/* bus */
++	COMPOSITE_NODIV(ACLK_BUS_M_ROOT, "aclk_bus_m_root", mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(43), 12, 2, MFLAGS,
++			RK3528_CLKGATE_CON(8), 7, GFLAGS),
++	GATE(ACLK_GIC, "aclk_gic", "aclk_bus_m_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(9), 1, GFLAGS),
++
++	COMPOSITE_NODIV(ACLK_BUS_ROOT, "aclk_bus_root", mux_200m_100m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(43), 6, 2, MFLAGS,
++			RK3528_CLKGATE_CON(8), 4, GFLAGS),
++	GATE(ACLK_SPINLOCK, "aclk_spinlock", "aclk_bus_root", 0,
++			RK3528_CLKGATE_CON(9), 2, GFLAGS),
++	GATE(ACLK_DMAC, "aclk_dmac", "aclk_bus_root", 0,
++			RK3528_CLKGATE_CON(9), 4, GFLAGS),
++	GATE(ACLK_DCF, "aclk_dcf", "aclk_bus_root", 0,
++			RK3528_CLKGATE_CON(11), 11, GFLAGS),
++	COMPOSITE(ACLK_BUS_VOPGL_ROOT, "aclk_bus_vopgl_root", mux_gpll_cpll_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(43), 3, 1, MFLAGS, 0, 3, DFLAGS,
++			RK3528_CLKGATE_CON(8), 0, GFLAGS),
++	COMPOSITE_NODIV(ACLK_BUS_H_ROOT, "aclk_bus_h_root", mux_500m_200m_100m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(43), 4, 2, MFLAGS,
++			RK3528_CLKGATE_CON(8), 2, GFLAGS),
++	GATE(ACLK_DMA2DDR, "aclk_dma2ddr", "aclk_bus_h_root", 0,
++			RK3528_CLKGATE_CON(10), 14, GFLAGS),
++
++	COMPOSITE_NODIV(HCLK_BUS_ROOT, "hclk_bus_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(43), 8, 2, MFLAGS,
++			RK3528_CLKGATE_CON(8), 5, GFLAGS),
++
++	COMPOSITE_NODIV(PCLK_BUS_ROOT, "pclk_bus_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(43), 10, 2, MFLAGS,
++			RK3528_CLKGATE_CON(8), 6, GFLAGS),
++	GATE(PCLK_DFT2APB, "pclk_dft2apb", "pclk_bus_root", 0,
++			RK3528_CLKGATE_CON(8), 13, GFLAGS),
++	GATE(PCLK_BUS_GRF, "pclk_bus_grf", "pclk_bus_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(8), 15, GFLAGS),
++	GATE(PCLK_TIMER, "pclk_timer", "pclk_bus_root", 0,
++			RK3528_CLKGATE_CON(9), 5, GFLAGS),
++	GATE(PCLK_JDBCK_DAP, "pclk_jdbck_dap", "pclk_bus_root", 0,
++			RK3528_CLKGATE_CON(9), 12, GFLAGS),
++	GATE(PCLK_WDT_NS, "pclk_wdt_ns", "pclk_bus_root", 0,
++			RK3528_CLKGATE_CON(9), 15, GFLAGS),
++	GATE(PCLK_UART0, "pclk_uart0", "pclk_bus_root", 0,
++			RK3528_CLKGATE_CON(10), 7, GFLAGS),
++	GATE(PCLK_PWM0, "pclk_pwm0", "pclk_bus_root", 0,
++			RK3528_CLKGATE_CON(11), 4, GFLAGS),
++	GATE(PCLK_PWM1, "pclk_pwm1", "pclk_bus_root", 0,
++			RK3528_CLKGATE_CON(11), 7, GFLAGS),
++	GATE(PCLK_DMA2DDR, "pclk_dma2ddr", "pclk_bus_root", 0,
++			RK3528_CLKGATE_CON(10), 13, GFLAGS),
++	GATE(PCLK_SCR, "pclk_scr", "pclk_bus_root", 0,
++			RK3528_CLKGATE_CON(11), 10, GFLAGS),
++	GATE(PCLK_INTMUX, "pclk_intmux", "pclk_bus_root", CLK_IGNORE_UNUSED,
++			RK3528_CLKGATE_CON(11), 12, GFLAGS),
++
++	COMPOSITE_NODIV(CLK_PWM0, "clk_pwm0", mux_100m_50m_24m_p, 0,
++			RK3528_CLKSEL_CON(44), 6, 2, MFLAGS,
++			RK3528_CLKGATE_CON(11), 5, GFLAGS),
++	COMPOSITE_NODIV(CLK_PWM1, "clk_pwm1", mux_100m_50m_24m_p, 0,
++			RK3528_CLKSEL_CON(44), 8, 2, MFLAGS,
++			RK3528_CLKGATE_CON(11), 8, GFLAGS),
++
++	GATE(CLK_CAPTURE_PWM1, "clk_capture_pwm1", "xin24m", 0,
++			RK3528_CLKGATE_CON(11), 9, GFLAGS),
++	GATE(CLK_CAPTURE_PWM0, "clk_capture_pwm0", "xin24m", 0,
++			RK3528_CLKGATE_CON(11), 6, GFLAGS),
++	GATE(CLK_JDBCK_DAP, "clk_jdbck_dap", "xin24m", 0,
++			RK3528_CLKGATE_CON(9), 13, GFLAGS),
++	GATE(TCLK_WDT_NS, "tclk_wdt_ns", "xin24m", 0,
++			RK3528_CLKGATE_CON(10), 0, GFLAGS),
++
++	GATE(CLK_TIMER_ROOT, "clk_timer_root", "xin24m", 0,
++			RK3528_CLKGATE_CON(8), 9, GFLAGS),
++	GATE(CLK_TIMER0, "clk_timer0", "clk_timer_root", 0,
++			RK3528_CLKGATE_CON(9), 6, GFLAGS),
++	GATE(CLK_TIMER1, "clk_timer1", "clk_timer_root", 0,
++			RK3528_CLKGATE_CON(9), 7, GFLAGS),
++	GATE(CLK_TIMER2, "clk_timer2", "clk_timer_root", 0,
++			RK3528_CLKGATE_CON(9), 8, GFLAGS),
++	GATE(CLK_TIMER3, "clk_timer3", "clk_timer_root", 0,
++			RK3528_CLKGATE_CON(9), 9, GFLAGS),
++	GATE(CLK_TIMER4, "clk_timer4", "clk_timer_root", 0,
++			RK3528_CLKGATE_CON(9), 10, GFLAGS),
++	GATE(CLK_TIMER5, "clk_timer5", "clk_timer_root", 0,
++			RK3528_CLKGATE_CON(9), 11, GFLAGS),
++
++	/* pmu */
++	GATE(HCLK_PMU_ROOT, "hclk_pmu_root", "clk_100m_src", CLK_IGNORE_UNUSED,
++			RK3528_PMU_CLKGATE_CON(0), 1, GFLAGS),
++	GATE(PCLK_PMU_ROOT, "pclk_pmu_root", "clk_100m_src", CLK_IGNORE_UNUSED,
++			RK3528_PMU_CLKGATE_CON(0), 0, GFLAGS),
++
++	GATE(FCLK_MCU, "fclk_mcu", "hclk_pmu_root", 0,
++			RK3528_PMU_CLKGATE_CON(0), 7, GFLAGS),
++	GATE(HCLK_PMU_SRAM, "hclk_pmu_sram", "hclk_pmu_root", CLK_IS_CRITICAL,
++			RK3528_PMU_CLKGATE_CON(5), 4, GFLAGS),
++
++	GATE(PCLK_I2C2, "pclk_i2c2", "pclk_pmu_root", 0,
++			RK3528_PMU_CLKGATE_CON(0), 2, GFLAGS),
++	GATE(PCLK_PMU_HP_TIMER, "pclk_pmu_hp_timer", "pclk_pmu_root", 0,
++			RK3528_PMU_CLKGATE_CON(1), 2, GFLAGS),
++	GATE(PCLK_PMU_IOC, "pclk_pmu_ioc", "pclk_pmu_root", CLK_IS_CRITICAL,
++			RK3528_PMU_CLKGATE_CON(1), 5, GFLAGS),
++	GATE(PCLK_PMU_CRU, "pclk_pmu_cru", "pclk_pmu_root", CLK_IS_CRITICAL,
++			RK3528_PMU_CLKGATE_CON(1), 6, GFLAGS),
++	GATE(PCLK_PMU_GRF, "pclk_pmu_grf", "pclk_pmu_root", CLK_IS_CRITICAL,
++			RK3528_PMU_CLKGATE_CON(1), 7, GFLAGS),
++	GATE(PCLK_PMU_WDT, "pclk_pmu_wdt", "pclk_pmu_root", 0,
++			RK3528_PMU_CLKGATE_CON(1), 10, GFLAGS),
++	GATE(PCLK_PMU, "pclk_pmu", "pclk_pmu_root", CLK_IS_CRITICAL,
++			RK3528_PMU_CLKGATE_CON(0), 13, GFLAGS),
++	GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_pmu_root", 0,
++			RK3528_PMU_CLKGATE_CON(0), 14, GFLAGS),
++	GATE(PCLK_OSCCHK, "pclk_oscchk", "pclk_pmu_root", 0,
++			RK3528_PMU_CLKGATE_CON(0), 9, GFLAGS),
++	GATE(PCLK_PMU_MAILBOX, "pclk_pmu_mailbox", "pclk_pmu_root", 0,
++			RK3528_PMU_CLKGATE_CON(1), 12, GFLAGS),
++	GATE(PCLK_SCRKEYGEN, "pclk_scrkeygen", "pclk_pmu_root", 0,
++			RK3528_PMU_CLKGATE_CON(1), 15, GFLAGS),
++	GATE(PCLK_PVTM_PMU, "pclk_pvtm_pmu", "pclk_pmu_root", 0,
++			RK3528_PMU_CLKGATE_CON(5), 1, GFLAGS),
++
++	COMPOSITE_NODIV(CLK_I2C2, "clk_i2c2", clk_i2c2_p, 0,
++			RK3528_PMU_CLKSEL_CON(0), 0, 2, MFLAGS,
++			RK3528_PMU_CLKGATE_CON(0), 3, GFLAGS),
++
++	GATE(CLK_REFOUT, "clk_refout", "xin24m", 0,
++			RK3528_PMU_CLKGATE_CON(2), 4, GFLAGS),
++	COMPOSITE_NOMUX(CLK_PVTM_PMU, "clk_pvtm_pmu", "xin24m", 0,
++			RK3528_PMU_CLKSEL_CON(5), 0, 5, DFLAGS,
++			RK3528_PMU_CLKGATE_CON(5), 0, GFLAGS),
++
++	COMPOSITE_FRAC(XIN_OSC0_DIV, "xin_osc0_div", "xin24m", 0,
++			RK3528_PMU_CLKSEL_CON(1), 0,
++			RK3528_PMU_CLKGATE_CON(1), 0, GFLAGS),
++	/* clk_32k: internal! No path from external osc 32k */
++	MUX(CLK_DEEPSLOW, "clk_32k", clk_32k_p, CLK_IS_CRITICAL,
++			RK3528_PMU_CLKSEL_CON(2), 0, 1, MFLAGS),
++	GATE(RTC_CLK_MCU, "rtc_clk_mcu", "clk_32k", 0,
++			RK3528_PMU_CLKGATE_CON(0), 8, GFLAGS),
++	GATE(CLK_DDR_FAIL_SAFE, "clk_ddr_fail_safe", "xin24m", CLK_IGNORE_UNUSED,
++			RK3528_PMU_CLKGATE_CON(1), 1, GFLAGS),
++
++	COMPOSITE_NODIV(DBCLK_GPIO0, "dbclk_gpio0", mux_24m_32k_p, 0,
++			RK3528_PMU_CLKSEL_CON(0), 2, 1, MFLAGS,
++			RK3528_PMU_CLKGATE_CON(0), 15, GFLAGS),
++	COMPOSITE_NODIV(TCLK_PMU_WDT, "tclk_pmu_wdt", mux_24m_32k_p, 0,
++			RK3528_PMU_CLKSEL_CON(2), 1, 1, MFLAGS,
++			RK3528_PMU_CLKGATE_CON(1), 11, GFLAGS),
++
++	/* core */
++	COMPOSITE_NOMUX(ACLK_M_CORE_BIU, "aclk_m_core", "armclk", CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(39), 11, 5, DFLAGS | CLK_DIVIDER_READ_ONLY,
++			RK3528_CLKGATE_CON(5), 12, GFLAGS),
++	COMPOSITE_NOMUX(PCLK_DBG, "pclk_dbg", "armclk", CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(40), 1, 5, DFLAGS | CLK_DIVIDER_READ_ONLY,
++			RK3528_CLKGATE_CON(5), 13, GFLAGS),
++	GATE(PCLK_CPU_ROOT, "pclk_cpu_root", "pclk_dbg", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(6), 1, GFLAGS),
++	GATE(PCLK_CORE_GRF, "pclk_core_grf", "pclk_cpu_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(6), 2, GFLAGS),
++
++	/* ddr */
++	GATE(CLK_DDRC_SRC, "clk_ddrc_src", "dpll", CLK_IS_CRITICAL,
++			RK3528_DDRPHY_CLKGATE_CON(0), 0, GFLAGS),
++	GATE(CLK_DDR_PHY, "clk_ddr_phy", "dpll", CLK_IS_CRITICAL,
++			RK3528_DDRPHY_CLKGATE_CON(0), 1, GFLAGS),
++
++	COMPOSITE_NODIV(PCLK_DDR_ROOT, "pclk_ddr_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(90), 0, 2, MFLAGS,
++			RK3528_CLKGATE_CON(45), 0, GFLAGS),
++	GATE(PCLK_DDRMON, "pclk_ddrmon", "pclk_ddr_root", CLK_IGNORE_UNUSED,
++			RK3528_CLKGATE_CON(45), 3, GFLAGS),
++	GATE(PCLK_DDR_HWLP, "pclk_ddr_hwlp", "pclk_ddr_root", CLK_IGNORE_UNUSED,
++			RK3528_CLKGATE_CON(45), 8, GFLAGS),
++	GATE(CLK_TIMER_DDRMON, "clk_timer_ddrmon", "xin24m", CLK_IGNORE_UNUSED,
++			RK3528_CLKGATE_CON(45), 4, GFLAGS),
++
++	GATE(PCLK_DDRC, "pclk_ddrc", "pclk_ddr_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(45), 2, GFLAGS),
++	GATE(PCLK_DDR_GRF, "pclk_ddr_grf", "pclk_ddr_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(45), 6, GFLAGS),
++	GATE(PCLK_DDRPHY, "pclk_ddrphy", "pclk_ddr_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(45), 9, GFLAGS),
++
++	GATE(ACLK_DDR_UPCTL, "aclk_ddr_upctl", "clk_ddrc_src", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(45), 11, GFLAGS),
++	GATE(CLK_DDR_UPCTL, "clk_ddr_upctl", "clk_ddrc_src", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(45), 12, GFLAGS),
++	GATE(CLK_DDRMON, "clk_ddrmon", "clk_ddrc_src", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(45), 13, GFLAGS),
++	GATE(ACLK_DDR_SCRAMBLE, "aclk_ddr_scramble", "clk_ddrc_src", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(45), 14, GFLAGS),
++	GATE(ACLK_SPLIT, "aclk_split", "clk_ddrc_src", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(45), 15, GFLAGS),
++
++	/* gpu */
++	COMPOSITE_NODIV(ACLK_GPU_ROOT, "aclk_gpu_root", mux_500m_300m_100m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(76), 0, 2, MFLAGS,
++			RK3528_CLKGATE_CON(34), 0, GFLAGS),
++	COMPOSITE_NODIV(ACLK_GPU, "aclk_gpu", aclk_gpu_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(76), 6, 1, MFLAGS,
++			RK3528_CLKGATE_CON(34), 7, GFLAGS),
++	GATE(ACLK_GPU_MALI, "aclk_gpu_mali", "aclk_gpu", 0,
++			RK3528_CLKGATE_CON(34), 8, GFLAGS),
++	COMPOSITE_NODIV(PCLK_GPU_ROOT, "pclk_gpu_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(76), 4, 2, MFLAGS,
++			RK3528_CLKGATE_CON(34), 2, GFLAGS),
++
++	/* rkvdec */
++	COMPOSITE_NODIV(ACLK_RKVDEC_ROOT_NDFT, "aclk_rkvdec_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(88), 6, 2, MFLAGS,
++			RK3528_CLKGATE_CON(44), 3, GFLAGS),
++	COMPOSITE_NODIV(HCLK_RKVDEC_ROOT, "hclk_rkvdec_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(88), 4, 2, MFLAGS,
++			RK3528_CLKGATE_CON(44), 2, GFLAGS),
++	GATE(PCLK_DDRPHY_CRU, "pclk_ddrphy_cru", "hclk_rkvdec_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(44), 4, GFLAGS),
++	GATE(HCLK_RKVDEC, "hclk_rkvdec", "hclk_rkvdec_root", 0,
++			RK3528_CLKGATE_CON(44), 9, GFLAGS),
++	COMPOSITE_NODIV(CLK_HEVC_CA_RKVDEC, "clk_hevc_ca_rkvdec", mux_600m_300m_200m_24m_p, 0,
++			RK3528_CLKSEL_CON(88), 11, 2, MFLAGS,
++			RK3528_CLKGATE_CON(44), 11, GFLAGS),
++	MUX(ACLK_RKVDEC_PVTMUX_ROOT, "aclk_rkvdec_pvtmux_root", aclk_rkvdec_pvtmux_root_p, CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(88), 13, 1, MFLAGS),
++	GATE(ACLK_RKVDEC, "aclk_rkvdec", "aclk_rkvdec_pvtmux_root", 0,
++			RK3528_CLKGATE_CON(44), 8, GFLAGS),
++
++	/* rkvenc */
++	COMPOSITE_NODIV(ACLK_RKVENC_ROOT, "aclk_rkvenc_root", mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(79), 2, 2, MFLAGS,
++			RK3528_CLKGATE_CON(36), 1, GFLAGS),
++	GATE(ACLK_RKVENC, "aclk_rkvenc", "aclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(36), 7, GFLAGS),
++
++	COMPOSITE_NODIV(PCLK_RKVENC_ROOT, "pclk_rkvenc_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(79), 4, 2, MFLAGS,
++			RK3528_CLKGATE_CON(36), 2, GFLAGS),
++	GATE(PCLK_RKVENC_IOC, "pclk_rkvenc_ioc", "pclk_rkvenc_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(37), 10, GFLAGS),
++	GATE(PCLK_RKVENC_GRF, "pclk_rkvenc_grf", "pclk_rkvenc_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(38), 6, GFLAGS),
++	GATE(PCLK_I2C1, "pclk_i2c1", "pclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(36), 11, GFLAGS),
++	GATE(PCLK_I2C0, "pclk_i2c0", "pclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(36), 13, GFLAGS),
++	GATE(PCLK_SPI0, "pclk_spi0", "pclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(37), 2, GFLAGS),
++	GATE(PCLK_GPIO4, "pclk_gpio4", "pclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(37), 8, GFLAGS),
++	GATE(PCLK_UART1, "pclk_uart1", "pclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(38), 2, GFLAGS),
++	GATE(PCLK_UART3, "pclk_uart3", "pclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(38), 4, GFLAGS),
++	GATE(PCLK_CAN0, "pclk_can0", "pclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(38), 7, GFLAGS),
++	GATE(PCLK_CAN1, "pclk_can1", "pclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(38), 9, GFLAGS),
++
++	COMPOSITE_NODIV(MCLK_PDM, "mclk_pdm", mux_150m_100m_24m_p, 0,
++			RK3528_CLKSEL_CON(80), 12, 2, MFLAGS,
++			RK3528_CLKGATE_CON(38), 1, GFLAGS),
++	COMPOSITE(CLK_CAN0, "clk_can0", mux_gpll_cpll_p, 0,
++			RK3528_CLKSEL_CON(81), 6, 1, MFLAGS, 0, 6, DFLAGS,
++			RK3528_CLKGATE_CON(38), 8, GFLAGS),
++	COMPOSITE(CLK_CAN1, "clk_can1", mux_gpll_cpll_p, 0,
++			RK3528_CLKSEL_CON(81), 13, 1, MFLAGS, 7, 6, DFLAGS,
++			RK3528_CLKGATE_CON(38), 10, GFLAGS),
++
++	COMPOSITE_NODIV(HCLK_RKVENC_ROOT, "hclk_rkvenc_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(79), 0, 2, MFLAGS,
++			RK3528_CLKGATE_CON(36), 0, GFLAGS),
++	GATE(HCLK_SAI_I2S1, "hclk_sai_i2s1", "hclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(36), 9, GFLAGS),
++	GATE(HCLK_SPDIF, "hclk_spdif", "hclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(37), 14, GFLAGS),
++	GATE(HCLK_PDM, "hclk_pdm", "hclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(38), 0, GFLAGS),
++	GATE(HCLK_RKVENC, "hclk_rkvenc", "hclk_rkvenc_root", 0,
++			RK3528_CLKGATE_CON(36), 6, GFLAGS),
++
++	COMPOSITE_NODIV(CLK_CORE_RKVENC, "clk_core_rkvenc", mux_300m_200m_100m_24m_p, 0,
++			RK3528_CLKSEL_CON(79), 6, 2, MFLAGS,
++			RK3528_CLKGATE_CON(36), 8, GFLAGS),
++	COMPOSITE_NODIV(CLK_I2C0, "clk_i2c0", mux_200m_100m_50m_24m_p, 0,
++			RK3528_CLKSEL_CON(79), 11, 2, MFLAGS,
++			RK3528_CLKGATE_CON(36), 14, GFLAGS),
++	COMPOSITE_NODIV(CLK_I2C1, "clk_i2c1", mux_200m_100m_50m_24m_p, 0,
++			RK3528_CLKSEL_CON(79), 9, 2, MFLAGS,
++			RK3528_CLKGATE_CON(36), 12, GFLAGS),
++
++	COMPOSITE_NODIV(CLK_SPI0, "clk_spi0", mux_200m_100m_50m_24m_p, 0,
++			RK3528_CLKSEL_CON(79), 13, 2, MFLAGS,
++			RK3528_CLKGATE_CON(37), 3, GFLAGS),
++	COMPOSITE_NODIV(MCLK_SAI_I2S1, "mclk_sai_i2s1", mclk_sai_i2s1_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(79), 8, 1, MFLAGS,
++			RK3528_CLKGATE_CON(36), 10, GFLAGS),
++	GATE(DBCLK_GPIO4, "dbclk_gpio4", "xin24m", 0,
++			RK3528_CLKGATE_CON(37), 9, GFLAGS),
++
++	/* vo */
++	COMPOSITE_NODIV(HCLK_VO_ROOT, "hclk_vo_root", mux_150m_100m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(83), 2, 2, MFLAGS,
++			RK3528_CLKGATE_CON(39), 1, GFLAGS),
++	GATE(HCLK_VOP, "hclk_vop", "hclk_vo_root", 0,
++			RK3528_CLKGATE_CON(40), 2, GFLAGS),
++	GATE(HCLK_USBHOST, "hclk_usbhost", "hclk_vo_root", 0,
++			RK3528_CLKGATE_CON(43), 3, GFLAGS),
++	GATE(HCLK_JPEG_DECODER, "hclk_jpeg_decoder", "hclk_vo_root", 0,
++			RK3528_CLKGATE_CON(41), 7, GFLAGS),
++	GATE(HCLK_VDPP, "hclk_vdpp", "hclk_vo_root", 0,
++			RK3528_CLKGATE_CON(39), 10, GFLAGS),
++	GATE(HCLK_CVBS, "hclk_cvbs", "hclk_vo_root", 0,
++			RK3528_CLKGATE_CON(41), 3, GFLAGS),
++	GATE(HCLK_USBHOST_ARB, "hclk_usbhost_arb", "hclk_vo_root", 0,
++			RK3528_CLKGATE_CON(43), 4, GFLAGS),
++	GATE(HCLK_SAI_I2S3, "hclk_sai_i2s3", "hclk_vo_root", 0,
++			RK3528_CLKGATE_CON(42), 1, GFLAGS),
++	GATE(HCLK_HDCP, "hclk_hdcp", "hclk_vo_root", 0,
++			RK3528_CLKGATE_CON(41), 1, GFLAGS),
++	GATE(HCLK_RGA2E, "hclk_rga2e", "hclk_vo_root", 0,
++			RK3528_CLKGATE_CON(39), 7, GFLAGS),
++	GATE(HCLK_SDMMC0, "hclk_sdmmc0", "hclk_vo_root", 0,
++			RK3528_CLKGATE_CON(42), 9, GFLAGS),
++	GATE(HCLK_HDCP_KEY, "hclk_hdcp_key", "hclk_vo_root", 0,
++			RK3528_CLKGATE_CON(40), 15, GFLAGS),
++
++	COMPOSITE_NODIV(ACLK_VO_L_ROOT, "aclk_vo_l_root", mux_150m_100m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(84), 1, 2, MFLAGS,
++			RK3528_CLKGATE_CON(41), 8, GFLAGS),
++	GATE(ACLK_MAC_VO, "aclk_gmac0", "aclk_vo_l_root", 0,
++			RK3528_CLKGATE_CON(41), 10, GFLAGS),
++
++	COMPOSITE_NODIV(PCLK_VO_ROOT, "pclk_vo_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(83), 4, 2, MFLAGS,
++			RK3528_CLKGATE_CON(39), 2, GFLAGS),
++	GATE(PCLK_MAC_VO, "pclk_gmac0", "pclk_vo_root", 0,
++			RK3528_CLKGATE_CON(41), 11, GFLAGS),
++	GATE(PCLK_VCDCPHY, "pclk_vcdcphy", "pclk_vo_root", 0,
++			RK3528_CLKGATE_CON(42), 4, GFLAGS),
++	GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_vo_root", 0,
++			RK3528_CLKGATE_CON(42), 5, GFLAGS),
++	GATE(PCLK_VO_IOC, "pclk_vo_ioc", "pclk_vo_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(42), 7, GFLAGS),
++	GATE(PCLK_OTPC_NS, "pclk_otpc_ns", "pclk_vo_root", 0,
++			RK3528_CLKGATE_CON(42), 11, GFLAGS),
++	GATE(PCLK_UART4, "pclk_uart4", "pclk_vo_root", 0,
++			RK3528_CLKGATE_CON(43), 7, GFLAGS),
++	GATE(PCLK_I2C4, "pclk_i2c4", "pclk_vo_root", 0,
++			RK3528_CLKGATE_CON(43), 9, GFLAGS),
++	GATE(PCLK_I2C7, "pclk_i2c7", "pclk_vo_root", 0,
++			RK3528_CLKGATE_CON(43), 11, GFLAGS),
++
++	GATE(PCLK_USBPHY, "pclk_usbphy", "pclk_vo_root", 0,
++			RK3528_CLKGATE_CON(43), 13, GFLAGS),
++
++	GATE(PCLK_VO_GRF, "pclk_vo_grf", "pclk_vo_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(39), 13, GFLAGS),
++	GATE(PCLK_CRU, "pclk_cru", "pclk_vo_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(39), 15, GFLAGS),
++	GATE(PCLK_HDMI, "pclk_hdmi", "pclk_vo_root", 0,
++			RK3528_CLKGATE_CON(40), 6, GFLAGS),
++	GATE(PCLK_HDMIPHY, "pclk_hdmiphy", "pclk_vo_root", 0,
++			RK3528_CLKGATE_CON(40), 14, GFLAGS),
++	GATE(PCLK_HDCP, "pclk_hdcp", "pclk_vo_root", 0,
++			RK3528_CLKGATE_CON(41), 2, GFLAGS),
++
++	COMPOSITE_NODIV(CLK_CORE_VDPP, "clk_core_vdpp", mux_339m_200m_100m_24m_p, 0,
++			RK3528_CLKSEL_CON(83), 10, 2, MFLAGS,
++			RK3528_CLKGATE_CON(39), 12, GFLAGS),
++	COMPOSITE_NODIV(CLK_CORE_RGA2E, "clk_core_rga2e", mux_339m_200m_100m_24m_p, 0,
++			RK3528_CLKSEL_CON(83), 8, 2, MFLAGS,
++			RK3528_CLKGATE_CON(39), 9, GFLAGS),
++	COMPOSITE_NODIV(ACLK_JPEG_ROOT, "aclk_jpeg_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(84), 9, 2, MFLAGS,
++			RK3528_CLKGATE_CON(41), 15, GFLAGS),
++	GATE(ACLK_JPEG_DECODER, "aclk_jpeg_decoder", "aclk_jpeg_root", 0,
++			RK3528_CLKGATE_CON(41), 6, GFLAGS),
++
++	COMPOSITE_NODIV(ACLK_VO_ROOT, "aclk_vo_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(83), 0, 2, MFLAGS,
++			RK3528_CLKGATE_CON(39), 0, GFLAGS),
++	GATE(ACLK_RGA2E, "aclk_rga2e", "aclk_vo_root", 0,
++			RK3528_CLKGATE_CON(39), 8, GFLAGS),
++	GATE(ACLK_VDPP, "aclk_vdpp", "aclk_vo_root", 0,
++			RK3528_CLKGATE_CON(39), 11, GFLAGS),
++	GATE(ACLK_HDCP, "aclk_hdcp", "aclk_vo_root", 0,
++			RK3528_CLKGATE_CON(41), 0, GFLAGS),
++
++	COMPOSITE(CCLK_SRC_SDMMC0, "cclk_src_sdmmc0", mux_gpll_cpll_xin24m_p, 0,
++			RK3528_CLKSEL_CON(85), 6, 2, MFLAGS, 0, 6, DFLAGS,
++			RK3528_CLKGATE_CON(42), 8, GFLAGS),
++
++	COMPOSITE(ACLK_VOP_ROOT, "aclk_vop_root", mux_gpll_cpll_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(83), 15, 1, MFLAGS, 12, 3, DFLAGS,
++			RK3528_CLKGATE_CON(40), 0, GFLAGS),
++	GATE(ACLK_VOP, "aclk_vop", "aclk_vop_root", 0,
++			RK3528_CLKGATE_CON(40), 5, GFLAGS),
++
++	COMPOSITE_NODIV(CLK_I2C4, "clk_i2c4", mux_200m_100m_50m_24m_p, 0,
++			RK3528_CLKSEL_CON(85), 13, 2, MFLAGS,
++			RK3528_CLKGATE_CON(43), 10, GFLAGS),
++	COMPOSITE_NODIV(CLK_I2C7, "clk_i2c7", mux_200m_100m_50m_24m_p, 0,
++			RK3528_CLKSEL_CON(86), 0, 2, MFLAGS,
++			RK3528_CLKGATE_CON(43), 12, GFLAGS),
++	GATE(DBCLK_GPIO2, "dbclk_gpio2", "xin24m", 0,
++			RK3528_CLKGATE_CON(42), 6, GFLAGS),
++
++	GATE(CLK_HDMIHDP0, "clk_hdmihdp0", "xin24m", 0,
++			RK3528_CLKGATE_CON(43), 2, GFLAGS),
++	GATE(CLK_MACPHY, "clk_macphy", "xin24m", 0,
++			RK3528_CLKGATE_CON(42), 3, GFLAGS),
++	GATE(CLK_REF_USBPHY, "clk_ref_usbphy", "xin24m", 0,
++			RK3528_CLKGATE_CON(43), 14, GFLAGS),
++	GATE(CLK_SBPI_OTPC_NS, "clk_sbpi_otpc_ns", "xin24m", 0,
++			RK3528_CLKGATE_CON(42), 12, GFLAGS),
++	FACTOR(CLK_USER_OTPC_NS, "clk_user_otpc_ns", "clk_sbpi_otpc_ns",
++			0, 1, 2),
++
++	GATE(MCLK_SAI_I2S3, "mclk_sai_i2s3", "mclk_i2s3_8ch_sai_src", 0,
++			RK3528_CLKGATE_CON(42), 2, GFLAGS),
++	COMPOSITE_NODIV(DCLK_VOP0, "dclk_vop0", dclk_vop0_p, CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
++			RK3528_CLKSEL_CON(84), 0, 1, MFLAGS,
++			RK3528_CLKGATE_CON(40), 3, GFLAGS),
++	GATE(DCLK_VOP1, "dclk_vop1", "dclk_vop_src1", CLK_SET_RATE_PARENT,
++			RK3528_CLKGATE_CON(40), 4, GFLAGS),
++	FACTOR_GATE(DCLK_CVBS, "dclk_cvbs", "dclk_vop1", 0, 1, 4,
++			RK3528_CLKGATE_CON(41), 4, GFLAGS),
++	GATE(DCLK_4X_CVBS, "dclk_4x_cvbs", "dclk_vop1", 0,
++			RK3528_CLKGATE_CON(41), 5, GFLAGS),
++
++	FACTOR_GATE(CLK_SFR_HDMI, "clk_sfr_hdmi", "dclk_vop_src1", 0, 1, 4,
++			RK3528_CLKGATE_CON(40), 7, GFLAGS),
++
++	GATE(CLK_SPDIF_HDMI, "clk_spdif_hdmi", "mclk_spdif_src", 0,
++			RK3528_CLKGATE_CON(40), 10, GFLAGS),
++	GATE(MCLK_SPDIF, "mclk_spdif", "mclk_spdif_src", 0,
++			RK3528_CLKGATE_CON(37), 15, GFLAGS),
++	GATE(CLK_CEC_HDMI, "clk_cec_hdmi", "clk_32k", 0,
++			RK3528_CLKGATE_CON(40), 8, GFLAGS),
++
++	/* vpu */
++	GATE(DBCLK_GPIO1, "dbclk_gpio1", "xin24m", 0,
++			RK3528_CLKGATE_CON(26), 5, GFLAGS),
++	GATE(DBCLK_GPIO3, "dbclk_gpio3", "xin24m", 0,
++			RK3528_CLKGATE_CON(27), 1, GFLAGS),
++	GATE(CLK_SUSPEND_USB3OTG, "clk_suspend_usb3otg", "xin24m", 0,
++			RK3528_CLKGATE_CON(33), 4, GFLAGS),
++	GATE(CLK_PCIE_AUX, "clk_pcie_aux", "xin24m", 0,
++			RK3528_CLKGATE_CON(30), 2, GFLAGS),
++	GATE(TCLK_EMMC, "tclk_emmc", "xin24m", 0,
++			RK3528_CLKGATE_CON(26), 3, GFLAGS),
++	GATE(CLK_REF_USB3OTG, "clk_ref_usb3otg", "xin24m", 0,
++			RK3528_CLKGATE_CON(33), 2, GFLAGS),
++	COMPOSITE(CCLK_SRC_SDIO0, "cclk_src_sdio0", mux_gpll_cpll_xin24m_p, 0,
++			RK3528_CLKSEL_CON(72), 6, 2, MFLAGS, 0, 6, DFLAGS,
++			RK3528_CLKGATE_CON(32), 1, GFLAGS),
++
++	COMPOSITE_NODIV(PCLK_VPU_ROOT, "pclk_vpu_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(61), 4, 2, MFLAGS,
++			RK3528_CLKGATE_CON(25), 5, GFLAGS),
++	GATE(PCLK_VPU_GRF, "pclk_vpu_grf", "pclk_vpu_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(25), 12, GFLAGS),
++	GATE(PCLK_CRU_PCIE, "pclk_cru_pcie", "pclk_vpu_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(25), 11, GFLAGS),
++	GATE(PCLK_UART6, "pclk_uart6", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(27), 11, GFLAGS),
++	GATE(PCLK_CAN2, "pclk_can2", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(32), 7, GFLAGS),
++	GATE(PCLK_SPI1, "pclk_spi1", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(27), 4, GFLAGS),
++	GATE(PCLK_CAN3, "pclk_can3", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(32), 9, GFLAGS),
++	GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(27), 0, GFLAGS),
++	GATE(PCLK_GPIO1, "pclk_gpio1", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(26), 4, GFLAGS),
++	GATE(PCLK_SARADC, "pclk_saradc", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(32), 11, GFLAGS),
++	GATE(PCLK_ACODEC, "pclk_acodec", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(26), 13, GFLAGS),
++	GATE(PCLK_UART7, "pclk_uart7", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(27), 13, GFLAGS),
++	GATE(PCLK_UART5, "pclk_uart5", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(27), 9, GFLAGS),
++	GATE(PCLK_TSADC, "pclk_tsadc", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(32), 14, GFLAGS),
++	GATE(PCLK_PCIE, "pclk_pcie", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(30), 1, GFLAGS),
++	GATE(PCLK_UART2, "pclk_uart2", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(27), 7, GFLAGS),
++	GATE(PCLK_VPU_IOC, "pclk_vpu_ioc", "pclk_vpu_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(26), 8, GFLAGS),
++	GATE(PCLK_PIPE_GRF, "pclk_pipe_grf", "pclk_vpu_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(30), 7, GFLAGS),
++	GATE(PCLK_I2C5, "pclk_i2c5", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(28), 1, GFLAGS),
++	GATE(PCLK_PCIE_PHY, "pclk_pcie_phy", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(30), 6, GFLAGS),
++	GATE(PCLK_I2C3, "pclk_i2c3", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(27), 15, GFLAGS),
++	GATE(PCLK_MAC_VPU, "pclk_gmac1", "pclk_vpu_root", CLK_IS_CRITICAL,
++			RK3528_CLKGATE_CON(28), 6, GFLAGS),
++	GATE(PCLK_I2C6, "pclk_i2c6", "pclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(28), 3, GFLAGS),
++
++	COMPOSITE_NODIV(ACLK_VPU_L_ROOT, "aclk_vpu_l_root", mux_200m_100m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(60), 0, 2, MFLAGS,
++			RK3528_CLKGATE_CON(25), 0, GFLAGS),
++	GATE(ACLK_EMMC, "aclk_emmc", "aclk_vpu_l_root", 0,
++			RK3528_CLKGATE_CON(26), 1, GFLAGS),
++	GATE(ACLK_MAC_VPU, "aclk_gmac1", "aclk_vpu_l_root", 0,
++			RK3528_CLKGATE_CON(28), 5, GFLAGS),
++	GATE(ACLK_PCIE, "aclk_pcie", "aclk_vpu_l_root", 0,
++			RK3528_CLKGATE_CON(30), 3, GFLAGS),
++
++	GATE(ACLK_USB3OTG, "aclk_usb3otg", "aclk_vpu_l_root", 0,
++			RK3528_CLKGATE_CON(33), 1, GFLAGS),
++
++	COMPOSITE_NODIV(HCLK_VPU_ROOT, "hclk_vpu_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(61), 2, 2, MFLAGS,
++			RK3528_CLKGATE_CON(25), 4, GFLAGS),
++	GATE(HCLK_VPU, "hclk_vpu", "hclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(25), 10, GFLAGS),
++	GATE(HCLK_SFC, "hclk_sfc", "hclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(25), 13, GFLAGS),
++	GATE(HCLK_EMMC, "hclk_emmc", "hclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(26), 0, GFLAGS),
++	GATE(HCLK_SAI_I2S0, "hclk_sai_i2s0", "hclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(26), 9, GFLAGS),
++	GATE(HCLK_SAI_I2S2, "hclk_sai_i2s2", "hclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(26), 11, GFLAGS),
++
++	GATE(HCLK_PCIE_SLV, "hclk_pcie_slv", "hclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(30), 4, GFLAGS),
++	GATE(HCLK_PCIE_DBI, "hclk_pcie_dbi", "hclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(30), 5, GFLAGS),
++	GATE(HCLK_SDIO0, "hclk_sdio0", "hclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(32), 2, GFLAGS),
++	GATE(HCLK_SDIO1, "hclk_sdio1", "hclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(32), 4, GFLAGS),
++
++	COMPOSITE_NOMUX(CLK_GMAC1_VPU_25M, "clk_gmac1_25m", "ppll", 0,
++			RK3528_CLKSEL_CON(60), 2, 8, DFLAGS,
++			RK3528_CLKGATE_CON(25), 1, GFLAGS),
++	COMPOSITE_NOMUX(CLK_PPLL_125M_MATRIX, "clk_ppll_125m_src", "ppll", 0,
++			RK3528_CLKSEL_CON(60), 10, 5, DFLAGS,
++			RK3528_CLKGATE_CON(25), 2, GFLAGS),
++
++	COMPOSITE(CLK_CAN3, "clk_can3", mux_gpll_cpll_p, 0,
++			RK3528_CLKSEL_CON(73), 13, 1, MFLAGS, 7, 6, DFLAGS,
++			RK3528_CLKGATE_CON(32), 10, GFLAGS),
++	COMPOSITE_NODIV(CLK_I2C6, "clk_i2c6", mux_200m_100m_50m_24m_p, 0,
++			RK3528_CLKSEL_CON(64), 0, 2, MFLAGS,
++			RK3528_CLKGATE_CON(28), 4, GFLAGS),
++
++	COMPOSITE(SCLK_SFC, "sclk_sfc", mux_gpll_cpll_xin24m_p, 0,
++			RK3528_CLKSEL_CON(61), 12, 2, MFLAGS, 6, 6, DFLAGS,
++			RK3528_CLKGATE_CON(25), 14, GFLAGS),
++	COMPOSITE(CCLK_SRC_EMMC, "cclk_src_emmc", mux_gpll_cpll_xin24m_p, 0,
++			RK3528_CLKSEL_CON(62), 6, 2, MFLAGS, 0, 6, DFLAGS,
++			RK3528_CLKGATE_CON(25), 15, GFLAGS),
++
++	COMPOSITE_NODIV(ACLK_VPU_ROOT, "aclk_vpu_root",
++			mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL,
++			RK3528_CLKSEL_CON(61), 0, 2, MFLAGS,
++			RK3528_CLKGATE_CON(25), 3, GFLAGS),
++	GATE(ACLK_VPU, "aclk_vpu", "aclk_vpu_root", 0,
++			RK3528_CLKGATE_CON(25), 9, GFLAGS),
++
++	COMPOSITE_NODIV(CLK_SPI1, "clk_spi1", mux_200m_100m_50m_24m_p, 0,
++			RK3528_CLKSEL_CON(63), 10, 2, MFLAGS,
++			RK3528_CLKGATE_CON(27), 5, GFLAGS),
++	COMPOSITE(CCLK_SRC_SDIO1, "cclk_src_sdio1", mux_gpll_cpll_xin24m_p, 0,
++			RK3528_CLKSEL_CON(72), 14, 2, MFLAGS, 8, 6, DFLAGS,
++			RK3528_CLKGATE_CON(32), 3, GFLAGS),
++	COMPOSITE(CLK_CAN2, "clk_can2", mux_gpll_cpll_p, 0,
++			RK3528_CLKSEL_CON(73), 6, 1, MFLAGS, 0, 6, DFLAGS,
++			RK3528_CLKGATE_CON(32), 8, GFLAGS),
++	COMPOSITE_NOMUX(CLK_TSADC, "clk_tsadc", "xin24m", 0,
++			RK3528_CLKSEL_CON(74), 3, 5, DFLAGS,
++			RK3528_CLKGATE_CON(32), 15, GFLAGS),
++	COMPOSITE_NOMUX(CLK_SARADC, "clk_saradc", "xin24m", 0,
++			RK3528_CLKSEL_CON(74), 0, 3, DFLAGS,
++			RK3528_CLKGATE_CON(32), 12, GFLAGS),
++	COMPOSITE_NOMUX(CLK_TSADC_TSEN, "clk_tsadc_tsen", "xin24m", 0,
++			RK3528_CLKSEL_CON(74), 8, 5, DFLAGS,
++			RK3528_CLKGATE_CON(33), 0, GFLAGS),
++	COMPOSITE_NODIV(BCLK_EMMC, "bclk_emmc", mux_200m_100m_50m_24m_p, 0,
++			RK3528_CLKSEL_CON(62), 8, 2, MFLAGS,
++			RK3528_CLKGATE_CON(26), 2, GFLAGS),
++	COMPOSITE_NOMUX(MCLK_ACODEC_TX, "mclk_acodec_tx", "mclk_i2s2_2ch_sai_src", 0,
++			RK3528_CLKSEL_CON(63), 0, 8, DFLAGS,
++			RK3528_CLKGATE_CON(26), 14, GFLAGS),
++	COMPOSITE_NODIV(CLK_I2C3, "clk_i2c3", mux_200m_100m_50m_24m_p, 0,
++			RK3528_CLKSEL_CON(63), 12, 2, MFLAGS,
++			RK3528_CLKGATE_CON(28), 0, GFLAGS),
++	COMPOSITE_NODIV(CLK_I2C5, "clk_i2c5", mux_200m_100m_50m_24m_p, 0,
++			RK3528_CLKSEL_CON(63), 14, 2, MFLAGS,
++			RK3528_CLKGATE_CON(28), 2, GFLAGS),
++	COMPOSITE_NODIV(MCLK_SAI_I2S0, "mclk_sai_i2s0", mclk_sai_i2s0_p, CLK_SET_RATE_PARENT,
++			RK3528_CLKSEL_CON(62), 10, 1, MFLAGS,
++			RK3528_CLKGATE_CON(26), 10, GFLAGS),
++	GATE(MCLK_SAI_I2S2, "mclk_sai_i2s2", "mclk_i2s2_2ch_sai_src", 0,
++			RK3528_CLKGATE_CON(26), 12, GFLAGS),
++
++	/* pcie */
++	COMPOSITE_NOMUX(CLK_PPLL_100M_MATRIX, "clk_ppll_100m_src", "ppll", CLK_IS_CRITICAL,
++			RK3528_PCIE_CLKSEL_CON(1), 2, 5, DFLAGS,
++			RK3528_PCIE_CLKGATE_CON(0), 1, GFLAGS),
++	COMPOSITE_NOMUX(CLK_PPLL_50M_MATRIX, "clk_ppll_50m_src", "ppll", CLK_IS_CRITICAL,
++			RK3528_PCIE_CLKSEL_CON(1), 7, 5, DFLAGS,
++			RK3528_PCIE_CLKGATE_CON(0), 2, GFLAGS),
++	MUX(CLK_REF_PCIE_INNER_PHY, "clk_ref_pcie_inner_phy", clk_ref_pcie_inner_phy_p, 0,
++			RK3528_PCIE_CLKSEL_CON(1), 13, 1, MFLAGS),
++	FACTOR(CLK_REF_PCIE_100M_PHY, "clk_ref_pcie_100m_phy", "clk_ppll_100m_src",
++			0, 1, 1),
++
++	/* gmac */
++	DIV(CLK_GMAC0_SRC, "clk_gmac0_src", "gmac0", 0,
++			RK3528_CLKSEL_CON(84), 3, 6, DFLAGS),
++	GATE(CLK_GMAC0_TX, "clk_gmac0_tx", "clk_gmac0_src", 0,
++			RK3528_CLKGATE_CON(41), 13, GFLAGS),
++	GATE(CLK_GMAC0_RX, "clk_gmac0_rx", "clk_gmac0_src", 0,
++			RK3528_CLKGATE_CON(41), 14, GFLAGS),
++	GATE(CLK_GMAC0_RMII_50M, "clk_gmac0_rmii_50m", "gmac0", 0,
++			RK3528_CLKGATE_CON(41), 12, GFLAGS),
++
++	FACTOR(CLK_GMAC1_RMII_VPU, "clk_gmac1_50m", "clk_ppll_50m_src",
++			0, 1, 1),
++	FACTOR(CLK_GMAC1_SRC_VPU, "clk_gmac1_125m", "clk_ppll_125m_src",
++			0, 1, 1),
++};
++
++static int __init clk_rk3528_probe(struct platform_device *pdev)
++{
++	struct rockchip_clk_provider *ctx;
++	struct device *dev = &pdev->dev;
++	struct device_node *np = dev->of_node;
++	unsigned long nr_branches = ARRAY_SIZE(rk3528_clk_branches);
++	unsigned long nr_clks;
++	void __iomem *reg_base;
++
++	nr_clks = rockchip_clk_find_max_clk_id(rk3528_clk_branches,
++					       nr_branches) + 1;
++
++	reg_base = devm_platform_ioremap_resource(pdev, 0);
++	if (IS_ERR(reg_base))
++		return dev_err_probe(dev, PTR_ERR(reg_base),
++				     "could not map cru region");
++
++	ctx = rockchip_clk_init(np, reg_base, nr_clks);
++	if (IS_ERR(ctx))
++		return dev_err_probe(dev, PTR_ERR(ctx),
++				     "rockchip clk init failed");
++
++	rockchip_clk_register_plls(ctx, rk3528_pll_clks,
++				   ARRAY_SIZE(rk3528_pll_clks),
++				   RK3528_GRF_SOC_STATUS0);
++	rockchip_clk_register_armclk(ctx, ARMCLK, "armclk",
++				     mux_armclk, ARRAY_SIZE(mux_armclk),
++				     &rk3528_cpuclk_data, rk3528_cpuclk_rates,
++				     ARRAY_SIZE(rk3528_cpuclk_rates));
++	rockchip_clk_register_branches(ctx, rk3528_clk_branches, nr_branches);
++
++	rockchip_register_restart_notifier(ctx, RK3528_GLB_SRST_FST, NULL);
++
++	rockchip_clk_of_add_provider(np, ctx);
++
++	return 0;
++}
++
++static const struct of_device_id clk_rk3528_match_table[] = {
++	{ .compatible = "rockchip,rk3528-cru" },
++	{ /* end */ }
++};
++
++static struct platform_driver clk_rk3528_driver = {
++	.driver = {
++		.name			= "clk-rk3528",
++		.of_match_table		= clk_rk3528_match_table,
++		.suppress_bind_attrs	= true,
++	},
++};
++builtin_platform_driver_probe(clk_rk3528_driver, clk_rk3528_probe);
+--- a/drivers/clk/rockchip/clk.h
++++ b/drivers/clk/rockchip/clk.h
+@@ -208,6 +208,26 @@ struct clk;
+ #define RK3399_PMU_CLKGATE_CON(x)	((x) * 0x4 + 0x100)
+ #define RK3399_PMU_SOFTRST_CON(x)	((x) * 0x4 + 0x110)
+ 
++#define RK3528_PMU_CRU_BASE		0x10000
++#define RK3528_PCIE_CRU_BASE		0x20000
++#define RK3528_DDRPHY_CRU_BASE		0x28000
++#define RK3528_PLL_CON(x)		RK2928_PLL_CON(x)
++#define RK3528_PCIE_PLL_CON(x)		((x) * 0x4 + RK3528_PCIE_CRU_BASE)
++#define RK3528_DDRPHY_PLL_CON(x)	((x) * 0x4 + RK3528_DDRPHY_CRU_BASE)
++#define RK3528_MODE_CON			0x280
++#define RK3528_CLKSEL_CON(x)		((x) * 0x4 + 0x300)
++#define RK3528_CLKGATE_CON(x)		((x) * 0x4 + 0x800)
++#define RK3528_SOFTRST_CON(x)		((x) * 0x4 + 0xa00)
++#define RK3528_PMU_CLKSEL_CON(x)	((x) * 0x4 + 0x300 + RK3528_PMU_CRU_BASE)
++#define RK3528_PMU_CLKGATE_CON(x)	((x) * 0x4 + 0x800 + RK3528_PMU_CRU_BASE)
++#define RK3528_PCIE_CLKSEL_CON(x)	((x) * 0x4 + 0x300 + RK3528_PCIE_CRU_BASE)
++#define RK3528_PCIE_CLKGATE_CON(x)	((x) * 0x4 + 0x800 + RK3528_PCIE_CRU_BASE)
++#define RK3528_DDRPHY_CLKGATE_CON(x)	((x) * 0x4 + 0x800 + RK3528_DDRPHY_CRU_BASE)
++#define RK3528_DDRPHY_MODE_CON		(0x280 + RK3528_DDRPHY_CRU_BASE)
++#define RK3528_GLB_CNT_TH		0xc00
++#define RK3528_GLB_SRST_FST		0xc08
++#define RK3528_GLB_SRST_SND		0xc0c
++
+ #define RK3568_PLL_CON(x)		RK2928_PLL_CON(x)
+ #define RK3568_MODE_CON0		0xc0
+ #define RK3568_MISC_CON0		0xc4
diff --git a/target/linux/rockchip/patches-6.12/032-21-v6.15-clk-rockchip-rk3528-Add-reset-lookup-table.patch b/target/linux/rockchip/patches-6.12/032-21-v6.15-clk-rockchip-rk3528-Add-reset-lookup-table.patch
new file mode 100644
index 0000000000..cebf6270c8
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/032-21-v6.15-clk-rockchip-rk3528-Add-reset-lookup-table.patch
@@ -0,0 +1,364 @@
+From 5738362a5ee7e3417312e7fc03bcb0ffb12ba4f3 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Thu, 27 Feb 2025 17:52:57 +0000
+Subject: [PATCH] clk: rockchip: rk3528: Add reset lookup table
+
+In the commit 5d0eb375e685 ("clk: rockchip: Add clock controller driver
+for RK3528 SoC") only the dt-binding header was added for the reset
+controller for the RK3528 SoC.
+
+Add a reset lookup table generated from the SRST symbols used by vendor
+linux-6.1-stan-rkr5 kernel to complete support for the reset controller.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250227175302.2950788-1-jonas@kwiboo.se
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ drivers/clk/rockchip/Makefile     |   2 +-
+ drivers/clk/rockchip/clk-rk3528.c |   2 +
+ drivers/clk/rockchip/clk.h        |   1 +
+ drivers/clk/rockchip/rst-rk3528.c | 306 ++++++++++++++++++++++++++++++
+ 4 files changed, 310 insertions(+), 1 deletion(-)
+ create mode 100644 drivers/clk/rockchip/rst-rk3528.c
+
+--- a/drivers/clk/rockchip/Makefile
++++ b/drivers/clk/rockchip/Makefile
+@@ -29,7 +29,7 @@ obj-$(CONFIG_CLK_RK3308)        += clk-r
+ obj-$(CONFIG_CLK_RK3328)        += clk-rk3328.o
+ obj-$(CONFIG_CLK_RK3368)        += clk-rk3368.o
+ obj-$(CONFIG_CLK_RK3399)        += clk-rk3399.o
+-obj-$(CONFIG_CLK_RK3528)	+= clk-rk3528.o
++obj-$(CONFIG_CLK_RK3528)	+= clk-rk3528.o rst-rk3528.o
+ obj-$(CONFIG_CLK_RK3568)	+= clk-rk3568.o
+ obj-$(CONFIG_CLK_RK3576)	+= clk-rk3576.o rst-rk3576.o
+ obj-$(CONFIG_CLK_RK3588)	+= clk-rk3588.o rst-rk3588.o
+--- a/drivers/clk/rockchip/clk-rk3528.c
++++ b/drivers/clk/rockchip/clk-rk3528.c
+@@ -1092,6 +1092,8 @@ static int __init clk_rk3528_probe(struc
+ 				     ARRAY_SIZE(rk3528_cpuclk_rates));
+ 	rockchip_clk_register_branches(ctx, rk3528_clk_branches, nr_branches);
+ 
++	rk3528_rst_init(np, reg_base);
++
+ 	rockchip_register_restart_notifier(ctx, RK3528_GLB_SRST_FST, NULL);
+ 
+ 	rockchip_clk_of_add_provider(np, ctx);
+--- a/drivers/clk/rockchip/clk.h
++++ b/drivers/clk/rockchip/clk.h
+@@ -1187,6 +1187,7 @@ static inline void rockchip_register_sof
+ 	return rockchip_register_softrst_lut(np, NULL, num_regs, base, flags);
+ }
+ 
++void rk3528_rst_init(struct device_node *np, void __iomem *reg_base);
+ void rk3576_rst_init(struct device_node *np, void __iomem *reg_base);
+ void rk3588_rst_init(struct device_node *np, void __iomem *reg_base);
+ 
+--- /dev/null
++++ b/drivers/clk/rockchip/rst-rk3528.c
+@@ -0,0 +1,306 @@
++// SPDX-License-Identifier: GPL-2.0-or-later
++/*
++ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
++ * Based on Sebastian Reichel's implementation for RK3588
++ */
++
++#include <linux/module.h>
++#include <linux/of.h>
++#include <dt-bindings/reset/rockchip,rk3528-cru.h>
++#include "clk.h"
++
++/* 0xFF4A0000 + 0x0A00 */
++#define RK3528_CRU_RESET_OFFSET(id, reg, bit) [id] = (0 + reg * 16 + bit)
++
++/* mapping table for reset ID to register offset */
++static const int rk3528_register_offset[] = {
++	/* CRU_SOFTRST_CON03 */
++	RK3528_CRU_RESET_OFFSET(SRST_CORE0_PO, 3, 0),
++	RK3528_CRU_RESET_OFFSET(SRST_CORE1_PO, 3, 1),
++	RK3528_CRU_RESET_OFFSET(SRST_CORE2_PO, 3, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_CORE3_PO, 3, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_CORE0, 3, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_CORE1, 3, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_CORE2, 3, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_CORE3, 3, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_NL2, 3, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_CORE_BIU, 3, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_CORE_CRYPTO, 3, 10),
++
++	/* CRU_SOFTRST_CON05 */
++	RK3528_CRU_RESET_OFFSET(SRST_P_DBG, 5, 13),
++	RK3528_CRU_RESET_OFFSET(SRST_POT_DBG, 5, 14),
++	RK3528_CRU_RESET_OFFSET(SRST_NT_DBG, 5, 15),
++
++	/* CRU_SOFTRST_CON06 */
++	RK3528_CRU_RESET_OFFSET(SRST_P_CORE_GRF, 6, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_P_DAPLITE_BIU, 6, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_P_CPU_BIU, 6, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_REF_PVTPLL_CORE, 6, 7),
++
++	/* CRU_SOFTRST_CON08 */
++	RK3528_CRU_RESET_OFFSET(SRST_A_BUS_VOPGL_BIU, 8, 1),
++	RK3528_CRU_RESET_OFFSET(SRST_A_BUS_H_BIU, 8, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_A_SYSMEM_BIU, 8, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_A_BUS_BIU, 8, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_H_BUS_BIU, 8, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_P_BUS_BIU, 8, 12),
++	RK3528_CRU_RESET_OFFSET(SRST_P_DFT2APB, 8, 13),
++	RK3528_CRU_RESET_OFFSET(SRST_P_BUS_GRF, 8, 15),
++
++	/* CRU_SOFTRST_CON09 */
++	RK3528_CRU_RESET_OFFSET(SRST_A_BUS_M_BIU, 9, 0),
++	RK3528_CRU_RESET_OFFSET(SRST_A_GIC, 9, 1),
++	RK3528_CRU_RESET_OFFSET(SRST_A_SPINLOCK, 9, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_A_DMAC, 9, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_P_TIMER, 9, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_TIMER0, 9, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_TIMER1, 9, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_TIMER2, 9, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_TIMER3, 9, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_TIMER4, 9, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_TIMER5, 9, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_P_JDBCK_DAP, 9, 12),
++	RK3528_CRU_RESET_OFFSET(SRST_JDBCK_DAP, 9, 13),
++	RK3528_CRU_RESET_OFFSET(SRST_P_WDT_NS, 9, 15),
++
++	/* CRU_SOFTRST_CON10 */
++	RK3528_CRU_RESET_OFFSET(SRST_T_WDT_NS, 10, 0),
++	RK3528_CRU_RESET_OFFSET(SRST_H_TRNG_NS, 10, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_P_UART0, 10, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_S_UART0, 10, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_PKA_CRYPTO, 10, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_A_CRYPTO, 10, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_H_CRYPTO, 10, 12),
++	RK3528_CRU_RESET_OFFSET(SRST_P_DMA2DDR, 10, 13),
++	RK3528_CRU_RESET_OFFSET(SRST_A_DMA2DDR, 10, 14),
++
++	/* CRU_SOFTRST_CON11 */
++	RK3528_CRU_RESET_OFFSET(SRST_P_PWM0, 11, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_PWM0, 11, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_P_PWM1, 11, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_PWM1, 11, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_P_SCR, 11, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_A_DCF, 11, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_P_INTMUX, 11, 12),
++
++	/* CRU_SOFTRST_CON25 */
++	RK3528_CRU_RESET_OFFSET(SRST_A_VPU_BIU, 25, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_H_VPU_BIU, 25, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_P_VPU_BIU, 25, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_A_VPU, 25, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_H_VPU, 25, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_P_CRU_PCIE, 25, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_P_VPU_GRF, 25, 12),
++	RK3528_CRU_RESET_OFFSET(SRST_H_SFC, 25, 13),
++	RK3528_CRU_RESET_OFFSET(SRST_S_SFC, 25, 14),
++	RK3528_CRU_RESET_OFFSET(SRST_C_EMMC, 25, 15),
++
++	/* CRU_SOFTRST_CON26 */
++	RK3528_CRU_RESET_OFFSET(SRST_H_EMMC, 26, 0),
++	RK3528_CRU_RESET_OFFSET(SRST_A_EMMC, 26, 1),
++	RK3528_CRU_RESET_OFFSET(SRST_B_EMMC, 26, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_T_EMMC, 26, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_P_GPIO1, 26, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_DB_GPIO1, 26, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_A_VPU_L_BIU, 26, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_P_VPU_IOC, 26, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_H_SAI_I2S0, 26, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_M_SAI_I2S0, 26, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_H_SAI_I2S2, 26, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_M_SAI_I2S2, 26, 12),
++	RK3528_CRU_RESET_OFFSET(SRST_P_ACODEC, 26, 13),
++
++	/* CRU_SOFTRST_CON27 */
++	RK3528_CRU_RESET_OFFSET(SRST_P_GPIO3, 27, 0),
++	RK3528_CRU_RESET_OFFSET(SRST_DB_GPIO3, 27, 1),
++	RK3528_CRU_RESET_OFFSET(SRST_P_SPI1, 27, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_SPI1, 27, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_P_UART2, 27, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_S_UART2, 27, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_P_UART5, 27, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_S_UART5, 27, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_P_UART6, 27, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_S_UART6, 27, 12),
++	RK3528_CRU_RESET_OFFSET(SRST_P_UART7, 27, 13),
++	RK3528_CRU_RESET_OFFSET(SRST_S_UART7, 27, 14),
++	RK3528_CRU_RESET_OFFSET(SRST_P_I2C3, 27, 15),
++
++	/* CRU_SOFTRST_CON28 */
++	RK3528_CRU_RESET_OFFSET(SRST_I2C3, 28, 0),
++	RK3528_CRU_RESET_OFFSET(SRST_P_I2C5, 28, 1),
++	RK3528_CRU_RESET_OFFSET(SRST_I2C5, 28, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_P_I2C6, 28, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_I2C6, 28, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_A_MAC, 28, 5),
++
++	/* CRU_SOFTRST_CON30 */
++	RK3528_CRU_RESET_OFFSET(SRST_P_PCIE, 30, 1),
++	RK3528_CRU_RESET_OFFSET(SRST_PCIE_PIPE_PHY, 30, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_PCIE_POWER_UP, 30, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_P_PCIE_PHY, 30, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_P_PIPE_GRF, 30, 7),
++
++	/* CRU_SOFTRST_CON32 */
++	RK3528_CRU_RESET_OFFSET(SRST_H_SDIO0, 32, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_H_SDIO1, 32, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_TS_0, 32, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_TS_1, 32, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_P_CAN2, 32, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_CAN2, 32, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_P_CAN3, 32, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_CAN3, 32, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_P_SARADC, 32, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_SARADC, 32, 12),
++	RK3528_CRU_RESET_OFFSET(SRST_SARADC_PHY, 32, 13),
++	RK3528_CRU_RESET_OFFSET(SRST_P_TSADC, 32, 14),
++	RK3528_CRU_RESET_OFFSET(SRST_TSADC, 32, 15),
++
++	/* CRU_SOFTRST_CON33 */
++	RK3528_CRU_RESET_OFFSET(SRST_A_USB3OTG, 33, 1),
++
++	/* CRU_SOFTRST_CON34 */
++	RK3528_CRU_RESET_OFFSET(SRST_A_GPU_BIU, 34, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_P_GPU_BIU, 34, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_A_GPU, 34, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_REF_PVTPLL_GPU, 34, 9),
++
++	/* CRU_SOFTRST_CON36 */
++	RK3528_CRU_RESET_OFFSET(SRST_H_RKVENC_BIU, 36, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_A_RKVENC_BIU, 36, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_P_RKVENC_BIU, 36, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_H_RKVENC, 36, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_A_RKVENC, 36, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_CORE_RKVENC, 36, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_H_SAI_I2S1, 36, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_M_SAI_I2S1, 36, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_P_I2C1, 36, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_I2C1, 36, 12),
++	RK3528_CRU_RESET_OFFSET(SRST_P_I2C0, 36, 13),
++	RK3528_CRU_RESET_OFFSET(SRST_I2C0, 36, 14),
++
++	/* CRU_SOFTRST_CON37 */
++	RK3528_CRU_RESET_OFFSET(SRST_P_SPI0, 37, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_SPI0, 37, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_P_GPIO4, 37, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_DB_GPIO4, 37, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_P_RKVENC_IOC, 37, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_H_SPDIF, 37, 14),
++	RK3528_CRU_RESET_OFFSET(SRST_M_SPDIF, 37, 15),
++
++	/* CRU_SOFTRST_CON38 */
++	RK3528_CRU_RESET_OFFSET(SRST_H_PDM, 38, 0),
++	RK3528_CRU_RESET_OFFSET(SRST_M_PDM, 38, 1),
++	RK3528_CRU_RESET_OFFSET(SRST_P_UART1, 38, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_S_UART1, 38, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_P_UART3, 38, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_S_UART3, 38, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_P_RKVENC_GRF, 38, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_P_CAN0, 38, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_CAN0, 38, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_P_CAN1, 38, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_CAN1, 38, 10),
++
++	/* CRU_SOFTRST_CON39 */
++	RK3528_CRU_RESET_OFFSET(SRST_A_VO_BIU, 39, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_H_VO_BIU, 39, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_P_VO_BIU, 39, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_H_RGA2E, 39, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_A_RGA2E, 39, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_CORE_RGA2E, 39, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_H_VDPP, 39, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_A_VDPP, 39, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_CORE_VDPP, 39, 12),
++	RK3528_CRU_RESET_OFFSET(SRST_P_VO_GRF, 39, 13),
++	RK3528_CRU_RESET_OFFSET(SRST_P_CRU, 39, 15),
++
++	/* CRU_SOFTRST_CON40 */
++	RK3528_CRU_RESET_OFFSET(SRST_A_VOP_BIU, 40, 1),
++	RK3528_CRU_RESET_OFFSET(SRST_H_VOP, 40, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_D_VOP0, 40, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_D_VOP1, 40, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_A_VOP, 40, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_P_HDMI, 40, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_HDMI, 40, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_P_HDMIPHY, 40, 14),
++	RK3528_CRU_RESET_OFFSET(SRST_H_HDCP_KEY, 40, 15),
++
++	/* CRU_SOFTRST_CON41 */
++	RK3528_CRU_RESET_OFFSET(SRST_A_HDCP, 41, 0),
++	RK3528_CRU_RESET_OFFSET(SRST_H_HDCP, 41, 1),
++	RK3528_CRU_RESET_OFFSET(SRST_P_HDCP, 41, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_H_CVBS, 41, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_D_CVBS_VOP, 41, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_D_4X_CVBS_VOP, 41, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_A_JPEG_DECODER, 41, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_H_JPEG_DECODER, 41, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_A_VO_L_BIU, 41, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_A_MAC_VO, 41, 10),
++
++	/* CRU_SOFTRST_CON42 */
++	RK3528_CRU_RESET_OFFSET(SRST_A_JPEG_BIU, 42, 0),
++	RK3528_CRU_RESET_OFFSET(SRST_H_SAI_I2S3, 42, 1),
++	RK3528_CRU_RESET_OFFSET(SRST_M_SAI_I2S3, 42, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_MACPHY, 42, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_P_VCDCPHY, 42, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_P_GPIO2, 42, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_DB_GPIO2, 42, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_P_VO_IOC, 42, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_H_SDMMC0, 42, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_P_OTPC_NS, 42, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_SBPI_OTPC_NS, 42, 12),
++	RK3528_CRU_RESET_OFFSET(SRST_USER_OTPC_NS, 42, 13),
++
++	/* CRU_SOFTRST_CON43 */
++	RK3528_CRU_RESET_OFFSET(SRST_HDMIHDP0, 43, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_H_USBHOST, 43, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_H_USBHOST_ARB, 43, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_HOST_UTMI, 43, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_P_UART4, 43, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_S_UART4, 43, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_P_I2C4, 43, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_I2C4, 43, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_P_I2C7, 43, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_I2C7, 43, 12),
++	RK3528_CRU_RESET_OFFSET(SRST_P_USBPHY, 43, 13),
++	RK3528_CRU_RESET_OFFSET(SRST_USBPHY_POR, 43, 14),
++	RK3528_CRU_RESET_OFFSET(SRST_USBPHY_OTG, 43, 15),
++
++	/* CRU_SOFTRST_CON44 */
++	RK3528_CRU_RESET_OFFSET(SRST_USBPHY_HOST, 44, 0),
++	RK3528_CRU_RESET_OFFSET(SRST_P_DDRPHY_CRU, 44, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_H_RKVDEC_BIU, 44, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_A_RKVDEC_BIU, 44, 7),
++	RK3528_CRU_RESET_OFFSET(SRST_A_RKVDEC, 44, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_H_RKVDEC, 44, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_HEVC_CA_RKVDEC, 44, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_REF_PVTPLL_RKVDEC, 44, 12),
++
++	/* CRU_SOFTRST_CON45 */
++	RK3528_CRU_RESET_OFFSET(SRST_P_DDR_BIU, 45, 1),
++	RK3528_CRU_RESET_OFFSET(SRST_P_DDRC, 45, 2),
++	RK3528_CRU_RESET_OFFSET(SRST_P_DDRMON, 45, 3),
++	RK3528_CRU_RESET_OFFSET(SRST_TIMER_DDRMON, 45, 4),
++	RK3528_CRU_RESET_OFFSET(SRST_P_MSCH_BIU, 45, 5),
++	RK3528_CRU_RESET_OFFSET(SRST_P_DDR_GRF, 45, 6),
++	RK3528_CRU_RESET_OFFSET(SRST_P_DDR_HWLP, 45, 8),
++	RK3528_CRU_RESET_OFFSET(SRST_P_DDRPHY, 45, 9),
++	RK3528_CRU_RESET_OFFSET(SRST_MSCH_BIU, 45, 10),
++	RK3528_CRU_RESET_OFFSET(SRST_A_DDR_UPCTL, 45, 11),
++	RK3528_CRU_RESET_OFFSET(SRST_DDR_UPCTL, 45, 12),
++	RK3528_CRU_RESET_OFFSET(SRST_DDRMON, 45, 13),
++	RK3528_CRU_RESET_OFFSET(SRST_A_DDR_SCRAMBLE, 45, 14),
++	RK3528_CRU_RESET_OFFSET(SRST_A_SPLIT, 45, 15),
++
++	/* CRU_SOFTRST_CON46 */
++	RK3528_CRU_RESET_OFFSET(SRST_DDR_PHY, 46, 0),
++};
++
++void rk3528_rst_init(struct device_node *np, void __iomem *reg_base)
++{
++	rockchip_register_softrst_lut(np,
++				      rk3528_register_offset,
++				      ARRAY_SIZE(rk3528_register_offset),
++				      reg_base + RK3528_SOFTRST_CON(0),
++				      ROCKCHIP_SOFTRST_HIWORD_MASK);
++}
diff --git a/target/linux/rockchip/patches-6.12/032-22-v6.15-pinctrl-rockchip-Add-support-for-RK3528.patch b/target/linux/rockchip/patches-6.12/032-22-v6.15-pinctrl-rockchip-Add-support-for-RK3528.patch
new file mode 100644
index 0000000000..bce782de47
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/032-22-v6.15-pinctrl-rockchip-Add-support-for-RK3528.patch
@@ -0,0 +1,238 @@
+From a5e4cde647851ed67f19a5cb54a99282f32aae99 Mon Sep 17 00:00:00 2001
+From: Steven Liu <steven.liu at rock-chips.com>
+Date: Fri, 28 Feb 2025 06:40:09 +0000
+Subject: [PATCH] pinctrl: rockchip: Add support for RK3528
+
+Add gpio and pinctrl support for the 5 GPIO banks on RK3528.
+
+Signed-off-by: Steven Liu <steven.liu at rock-chips.com>
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Reviewed-by: Heiko Stuebner <heiko at sntech.de>
+Link: https://lore.kernel.org/20250228064024.3200000-4-jonas@kwiboo.se
+Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
+---
+ drivers/pinctrl/pinctrl-rockchip.c | 160 ++++++++++++++++++++++++++++-
+ drivers/pinctrl/pinctrl-rockchip.h |   1 +
+ 2 files changed, 160 insertions(+), 1 deletion(-)
+
+--- a/drivers/pinctrl/pinctrl-rockchip.c
++++ b/drivers/pinctrl/pinctrl-rockchip.c
+@@ -2003,6 +2003,115 @@ static int rk3399_calc_drv_reg_and_bit(s
+ 	return 0;
+ }
+ 
++#define RK3528_DRV_BITS_PER_PIN		8
++#define RK3528_DRV_PINS_PER_REG		2
++#define RK3528_DRV_GPIO0_OFFSET		0x100
++#define RK3528_DRV_GPIO1_OFFSET		0x20120
++#define RK3528_DRV_GPIO2_OFFSET		0x30160
++#define RK3528_DRV_GPIO3_OFFSET		0x20190
++#define RK3528_DRV_GPIO4_OFFSET		0x101C0
++
++static int rk3528_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
++				       int pin_num, struct regmap **regmap,
++				       int *reg, u8 *bit)
++{
++	struct rockchip_pinctrl *info = bank->drvdata;
++
++	*regmap = info->regmap_base;
++
++	if (bank->bank_num == 0)
++		*reg = RK3528_DRV_GPIO0_OFFSET;
++	else if (bank->bank_num == 1)
++		*reg = RK3528_DRV_GPIO1_OFFSET;
++	else if (bank->bank_num == 2)
++		*reg = RK3528_DRV_GPIO2_OFFSET;
++	else if (bank->bank_num == 3)
++		*reg = RK3528_DRV_GPIO3_OFFSET;
++	else if (bank->bank_num == 4)
++		*reg = RK3528_DRV_GPIO4_OFFSET;
++	else
++		dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
++
++	*reg += ((pin_num / RK3528_DRV_PINS_PER_REG) * 4);
++	*bit = pin_num % RK3528_DRV_PINS_PER_REG;
++	*bit *= RK3528_DRV_BITS_PER_PIN;
++
++	return 0;
++}
++
++#define RK3528_PULL_BITS_PER_PIN		2
++#define RK3528_PULL_PINS_PER_REG		8
++#define RK3528_PULL_GPIO0_OFFSET		0x200
++#define RK3528_PULL_GPIO1_OFFSET		0x20210
++#define RK3528_PULL_GPIO2_OFFSET		0x30220
++#define RK3528_PULL_GPIO3_OFFSET		0x20230
++#define RK3528_PULL_GPIO4_OFFSET		0x10240
++
++static int rk3528_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
++					int pin_num, struct regmap **regmap,
++					int *reg, u8 *bit)
++{
++	struct rockchip_pinctrl *info = bank->drvdata;
++
++	*regmap = info->regmap_base;
++
++	if (bank->bank_num == 0)
++		*reg = RK3528_PULL_GPIO0_OFFSET;
++	else if (bank->bank_num == 1)
++		*reg = RK3528_PULL_GPIO1_OFFSET;
++	else if (bank->bank_num == 2)
++		*reg = RK3528_PULL_GPIO2_OFFSET;
++	else if (bank->bank_num == 3)
++		*reg = RK3528_PULL_GPIO3_OFFSET;
++	else if (bank->bank_num == 4)
++		*reg = RK3528_PULL_GPIO4_OFFSET;
++	else
++		dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
++
++	*reg += ((pin_num / RK3528_PULL_PINS_PER_REG) * 4);
++	*bit = pin_num % RK3528_PULL_PINS_PER_REG;
++	*bit *= RK3528_PULL_BITS_PER_PIN;
++
++	return 0;
++}
++
++#define RK3528_SMT_BITS_PER_PIN		1
++#define RK3528_SMT_PINS_PER_REG		8
++#define RK3528_SMT_GPIO0_OFFSET		0x400
++#define RK3528_SMT_GPIO1_OFFSET		0x20410
++#define RK3528_SMT_GPIO2_OFFSET		0x30420
++#define RK3528_SMT_GPIO3_OFFSET		0x20430
++#define RK3528_SMT_GPIO4_OFFSET		0x10440
++
++static int rk3528_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
++					   int pin_num,
++					   struct regmap **regmap,
++					   int *reg, u8 *bit)
++{
++	struct rockchip_pinctrl *info = bank->drvdata;
++
++	*regmap = info->regmap_base;
++
++	if (bank->bank_num == 0)
++		*reg = RK3528_SMT_GPIO0_OFFSET;
++	else if (bank->bank_num == 1)
++		*reg = RK3528_SMT_GPIO1_OFFSET;
++	else if (bank->bank_num == 2)
++		*reg = RK3528_SMT_GPIO2_OFFSET;
++	else if (bank->bank_num == 3)
++		*reg = RK3528_SMT_GPIO3_OFFSET;
++	else if (bank->bank_num == 4)
++		*reg = RK3528_SMT_GPIO4_OFFSET;
++	else
++		dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
++
++	*reg += ((pin_num / RK3528_SMT_PINS_PER_REG) * 4);
++	*bit = pin_num % RK3528_SMT_PINS_PER_REG;
++	*bit *= RK3528_SMT_BITS_PER_PIN;
++
++	return 0;
++}
++
+ #define RK3568_PULL_PMU_OFFSET		0x20
+ #define RK3568_PULL_GRF_OFFSET		0x80
+ #define RK3568_PULL_BITS_PER_PIN	2
+@@ -2495,7 +2604,8 @@ static int rockchip_set_drive_perpin(str
+ 		rmask_bits = RK3588_DRV_BITS_PER_PIN;
+ 		ret = strength;
+ 		goto config;
+-	} else if (ctrl->type == RK3568) {
++	} else if (ctrl->type == RK3528 ||
++		   ctrl->type == RK3568) {
+ 		rmask_bits = RK3568_DRV_BITS_PER_PIN;
+ 		ret = (1 << (strength + 1)) - 1;
+ 		goto config;
+@@ -2639,6 +2749,7 @@ static int rockchip_get_pull(struct rock
+ 	case RK3328:
+ 	case RK3368:
+ 	case RK3399:
++	case RK3528:
+ 	case RK3568:
+ 	case RK3576:
+ 	case RK3588:
+@@ -2699,6 +2810,7 @@ static int rockchip_set_pull(struct rock
+ 	case RK3328:
+ 	case RK3368:
+ 	case RK3399:
++	case RK3528:
+ 	case RK3568:
+ 	case RK3576:
+ 	case RK3588:
+@@ -2965,6 +3077,7 @@ static bool rockchip_pinconf_pull_valid(
+ 	case RK3328:
+ 	case RK3368:
+ 	case RK3399:
++	case RK3528:
+ 	case RK3568:
+ 	case RK3576:
+ 	case RK3588:
+@@ -4084,6 +4197,49 @@ static struct rockchip_pin_ctrl rk3399_p
+ 		.drv_calc_reg		= rk3399_calc_drv_reg_and_bit,
+ };
+ 
++static struct rockchip_pin_bank rk3528_pin_banks[] = {
++	PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    0, 0, 0, 0),
++	PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    0x20020, 0x20028, 0x20030, 0x20038),
++	PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    0x30040, 0, 0, 0),
++	PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    0x20060, 0x20068, 0x20070, 0),
++	PIN_BANK_IOMUX_FLAGS_OFFSET(4, 32, "gpio4",
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    IOMUX_WIDTH_4BIT,
++				    0x10080, 0x10088, 0x10090, 0x10098),
++};
++
++static struct rockchip_pin_ctrl rk3528_pin_ctrl = {
++	.pin_banks		= rk3528_pin_banks,
++	.nr_banks		= ARRAY_SIZE(rk3528_pin_banks),
++	.label			= "RK3528-GPIO",
++	.type			= RK3528,
++	.pull_calc_reg		= rk3528_calc_pull_reg_and_bit,
++	.drv_calc_reg		= rk3528_calc_drv_reg_and_bit,
++	.schmitt_calc_reg	= rk3528_calc_schmitt_reg_and_bit,
++};
++
+ static struct rockchip_pin_bank rk3568_pin_banks[] = {
+ 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
+ 					     IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
+@@ -4208,6 +4364,8 @@ static const struct of_device_id rockchi
+ 		.data = &rk3368_pin_ctrl },
+ 	{ .compatible = "rockchip,rk3399-pinctrl",
+ 		.data = &rk3399_pin_ctrl },
++	{ .compatible = "rockchip,rk3528-pinctrl",
++		.data = &rk3528_pin_ctrl },
+ 	{ .compatible = "rockchip,rk3568-pinctrl",
+ 		.data = &rk3568_pin_ctrl },
+ 	{ .compatible = "rockchip,rk3576-pinctrl",
+--- a/drivers/pinctrl/pinctrl-rockchip.h
++++ b/drivers/pinctrl/pinctrl-rockchip.h
+@@ -196,6 +196,7 @@ enum rockchip_pinctrl_type {
+ 	RK3328,
+ 	RK3368,
+ 	RK3399,
++	RK3528,
+ 	RK3568,
+ 	RK3576,
+ 	RK3588,
diff --git a/target/linux/rockchip/patches-6.12/032-23-v6.16-dt-bindings-clock-Add-GRF-clock-definition-for-RK3528.patch b/target/linux/rockchip/patches-6.12/032-23-v6.16-dt-bindings-clock-Add-GRF-clock-definition-for-RK3528.patch
new file mode 100644
index 0000000000..e15d2cc14f
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/032-23-v6.16-dt-bindings-clock-Add-GRF-clock-definition-for-RK3528.patch
@@ -0,0 +1,31 @@
+From 8a023e86f3d999007f2687952afe78ef34a6aa91 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Tue, 6 May 2025 09:22:02 +0000
+Subject: [PATCH] dt-bindings: clock: Add GRF clock definition for RK3528
+
+These clocks are for SD/SDIO tuning purpose and come with registers
+in GRF syscon.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
+Link: https://lore.kernel.org/r/20250506092206.46143-2-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ include/dt-bindings/clock/rockchip,rk3528-cru.h | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/include/dt-bindings/clock/rockchip,rk3528-cru.h
++++ b/include/dt-bindings/clock/rockchip,rk3528-cru.h
+@@ -414,6 +414,12 @@
+ #define MCLK_I2S2_2CH_SAI_SRC_PRE	402
+ #define MCLK_I2S3_8CH_SAI_SRC_PRE	403
+ #define MCLK_SDPDIF_SRC_PRE		404
++#define SCLK_SDMMC_DRV			405
++#define SCLK_SDMMC_SAMPLE		406
++#define SCLK_SDIO0_DRV			407
++#define SCLK_SDIO0_SAMPLE		408
++#define SCLK_SDIO1_DRV			409
++#define SCLK_SDIO1_SAMPLE		410
+ 
+ /* scmi-clocks indices */
+ #define SCMI_PCLK_KEYREADER		0
diff --git a/target/linux/rockchip/patches-6.12/032-24-v6.16-clk-rockchip-Support-MMC-clocks-in-GRF-region.patch b/target/linux/rockchip/patches-6.12/032-24-v6.16-clk-rockchip-Support-MMC-clocks-in-GRF-region.patch
new file mode 100644
index 0000000000..760c221536
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/032-24-v6.16-clk-rockchip-Support-MMC-clocks-in-GRF-region.patch
@@ -0,0 +1,156 @@
+From 621ba4d9f6db560a7406fd732af1b495ff5aa103 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Tue, 6 May 2025 09:22:03 +0000
+Subject: [PATCH] clk: rockchip: Support MMC clocks in GRF region
+
+Registers of MMC drive/sample clocks in Rockchip RV1106 and RK3528
+locate in GRF regions. Adjust MMC clock code to support register
+operations through regmap.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Link: https://lore.kernel.org/r/20250506092206.46143-3-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ drivers/clk/rockchip/clk-mmc-phase.c | 24 ++++++++++++++++++++----
+ drivers/clk/rockchip/clk.c           | 16 ++++++++++++++--
+ drivers/clk/rockchip/clk.h           | 17 ++++++++++++++++-
+ 3 files changed, 50 insertions(+), 7 deletions(-)
+
+--- a/drivers/clk/rockchip/clk-mmc-phase.c
++++ b/drivers/clk/rockchip/clk-mmc-phase.c
+@@ -9,11 +9,14 @@
+ #include <linux/clk-provider.h>
+ #include <linux/io.h>
+ #include <linux/kernel.h>
++#include <linux/regmap.h>
+ #include "clk.h"
+ 
+ struct rockchip_mmc_clock {
+ 	struct clk_hw	hw;
+ 	void __iomem	*reg;
++	struct regmap	*grf;
++	int		grf_reg;
+ 	int		shift;
+ 	int		cached_phase;
+ 	struct notifier_block clk_rate_change_nb;
+@@ -54,7 +57,12 @@ static int rockchip_mmc_get_phase(struct
+ 	if (!rate)
+ 		return 0;
+ 
+-	raw_value = readl(mmc_clock->reg) >> (mmc_clock->shift);
++	if (mmc_clock->grf)
++		regmap_read(mmc_clock->grf, mmc_clock->grf_reg, &raw_value);
++	else
++		raw_value = readl(mmc_clock->reg);
++
++	raw_value >>= mmc_clock->shift;
+ 
+ 	degrees = (raw_value & ROCKCHIP_MMC_DEGREE_MASK) * 90;
+ 
+@@ -134,8 +142,12 @@ static int rockchip_mmc_set_phase(struct
+ 	raw_value = delay_num ? ROCKCHIP_MMC_DELAY_SEL : 0;
+ 	raw_value |= delay_num << ROCKCHIP_MMC_DELAYNUM_OFFSET;
+ 	raw_value |= nineties;
+-	writel(HIWORD_UPDATE(raw_value, 0x07ff, mmc_clock->shift),
+-	       mmc_clock->reg);
++	raw_value = HIWORD_UPDATE(raw_value, 0x07ff, mmc_clock->shift);
++
++	if (mmc_clock->grf)
++		regmap_write(mmc_clock->grf, mmc_clock->grf_reg, raw_value);
++	else
++		writel(raw_value, mmc_clock->reg);
+ 
+ 	pr_debug("%s->set_phase(%d) delay_nums=%u reg[0x%p]=0x%03x actual_degrees=%d\n",
+ 		clk_hw_get_name(hw), degrees, delay_num,
+@@ -189,7 +201,9 @@ static int rockchip_mmc_clk_rate_notify(
+ 
+ struct clk *rockchip_clk_register_mmc(const char *name,
+ 				const char *const *parent_names, u8 num_parents,
+-				void __iomem *reg, int shift)
++				void __iomem *reg,
++				struct regmap *grf, int grf_reg,
++				int shift)
+ {
+ 	struct clk_init_data init;
+ 	struct rockchip_mmc_clock *mmc_clock;
+@@ -208,6 +222,8 @@ struct clk *rockchip_clk_register_mmc(co
+ 
+ 	mmc_clock->hw.init = &init;
+ 	mmc_clock->reg = reg;
++	mmc_clock->grf = grf;
++	mmc_clock->grf_reg = grf_reg;
+ 	mmc_clock->shift = shift;
+ 
+ 	clk = clk_register(NULL, &mmc_clock->hw);
+--- a/drivers/clk/rockchip/clk.c
++++ b/drivers/clk/rockchip/clk.c
+@@ -509,8 +509,10 @@ void rockchip_clk_register_branches(stru
+ 		clk = NULL;
+ 
+ 		/* for GRF-dependent branches, choose the right grf first */
+-		if ((list->branch_type == branch_muxgrf || list->branch_type == branch_grf_gate) &&
+-				list->grf_type != grf_type_sys) {
++		if ((list->branch_type == branch_muxgrf ||
++		     list->branch_type == branch_grf_gate ||
++		     list->branch_type == branch_grf_mmc) &&
++		    list->grf_type != grf_type_sys) {
+ 			hash_for_each_possible(ctx->aux_grf_table, agrf, node, list->grf_type) {
+ 				if (agrf->type == list->grf_type) {
+ 					grf = agrf->grf;
+@@ -612,6 +614,16 @@ void rockchip_clk_register_branches(stru
+ 				list->name,
+ 				list->parent_names, list->num_parents,
+ 				ctx->reg_base + list->muxdiv_offset,
++				NULL, 0,
++				list->div_shift
++			);
++			break;
++		case branch_grf_mmc:
++			clk = rockchip_clk_register_mmc(
++				list->name,
++				list->parent_names, list->num_parents,
++				0,
++				grf, list->muxdiv_offset,
+ 				list->div_shift
+ 			);
+ 			break;
+--- a/drivers/clk/rockchip/clk.h
++++ b/drivers/clk/rockchip/clk.h
+@@ -580,7 +580,9 @@ struct clk *rockchip_clk_register_cpuclk
+ 
+ struct clk *rockchip_clk_register_mmc(const char *name,
+ 				const char *const *parent_names, u8 num_parents,
+-				void __iomem *reg, int shift);
++				void __iomem *reg,
++				struct regmap *grf, int grf_reg,
++				int shift);
+ 
+ /*
+  * DDRCLK flags, including method of setting the rate
+@@ -625,6 +627,7 @@ enum rockchip_clk_branch_type {
+ 	branch_grf_gate,
+ 	branch_linked_gate,
+ 	branch_mmc,
++	branch_grf_mmc,
+ 	branch_inverter,
+ 	branch_factor,
+ 	branch_ddrclk,
+@@ -991,6 +994,18 @@ struct rockchip_clk_branch {
+ 		.div_shift	= shift,			\
+ 	}
+ 
++#define MMC_GRF(_id, cname, pname, offset, shift, grftype)	\
++	{							\
++		.id		= _id,				\
++		.branch_type	= branch_grf_mmc,		\
++		.name		= cname,			\
++		.parent_names	= (const char *[]){ pname },	\
++		.num_parents	= 1,				\
++		.muxdiv_offset	= offset,			\
++		.div_shift	= shift,			\
++		.grf_type	= grftype,			\
++	}
++
+ #define INVERTER(_id, cname, pname, io, is, if)			\
+ 	{							\
+ 		.id		= _id,				\
diff --git a/target/linux/rockchip/patches-6.12/032-25-v6.16-clk-rockchip-Pass-NULL-as-reg-pointer-when-registering-GR.patch b/target/linux/rockchip/patches-6.12/032-25-v6.16-clk-rockchip-Pass-NULL-as-reg-pointer-when-registering-GR.patch
new file mode 100644
index 0000000000..12711fdf69
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/032-25-v6.16-clk-rockchip-Pass-NULL-as-reg-pointer-when-registering-GR.patch
@@ -0,0 +1,30 @@
+From 61bf658a4d95e8f982b6e66dea763bff57996349 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Sat, 10 May 2025 07:52:49 +0000
+Subject: [PATCH] clk: rockchip: Pass NULL as reg pointer when registering GRF
+ MMC clocks
+
+This corrects the type and suppresses sparse warnings about passing
+plain integers as NULL pointer.
+
+Fixes: 621ba4d9f6db ("clk: rockchip: Support MMC clocks in GRF region")
+Reported-by: kernel test robot <lkp at intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202505100302.YVtB1zhF-lkp@intel.com/
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Link: https://lore.kernel.org/r/20250510075248.34006-2-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ drivers/clk/rockchip/clk.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/clk/rockchip/clk.c
++++ b/drivers/clk/rockchip/clk.c
+@@ -622,7 +622,7 @@ void rockchip_clk_register_branches(stru
+ 			clk = rockchip_clk_register_mmc(
+ 				list->name,
+ 				list->parent_names, list->num_parents,
+-				0,
++				NULL,
+ 				grf, list->muxdiv_offset,
+ 				list->div_shift
+ 			);
diff --git a/target/linux/rockchip/patches-6.12/032-26-v6.16-clk-rockchip-rk3528-Add-SD-SDIO-tuning-clocks-in-GRF.patch b/target/linux/rockchip/patches-6.12/032-26-v6.16-clk-rockchip-rk3528-Add-SD-SDIO-tuning-clocks-in-GRF.patch
new file mode 100644
index 0000000000..f35af6bec0
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/032-26-v6.16-clk-rockchip-rk3528-Add-SD-SDIO-tuning-clocks-in-GRF.patch
@@ -0,0 +1,157 @@
+From 306d2f5ddaa765f04ffb54fc9437a6318f904b53 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Tue, 6 May 2025 09:22:04 +0000
+Subject: [PATCH] clk: rockchip: rk3528: Add SD/SDIO tuning clocks in GRF
+ region
+
+These clocks locate in VO and VPU GRF, serving for SD/SDIO controller
+tuning purpose. Add their definitions and register them in driver if
+corresponding GRF is available.
+
+GRFs are looked up by compatible to simplify devicetree binding.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Link: https://lore.kernel.org/r/20250506092206.46143-4-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ drivers/clk/rockchip/clk-rk3528.c | 82 ++++++++++++++++++++++++++++---
+ drivers/clk/rockchip/clk.h        |  5 ++
+ 2 files changed, 81 insertions(+), 6 deletions(-)
+
+--- a/drivers/clk/rockchip/clk-rk3528.c
++++ b/drivers/clk/rockchip/clk-rk3528.c
+@@ -10,6 +10,8 @@
+ #include <linux/of.h>
+ #include <linux/of_device.h>
+ #include <linux/platform_device.h>
++#include <linux/mfd/syscon.h>
++#include <linux/minmax.h>
+ 
+ #include <dt-bindings/clock/rockchip,rk3528-cru.h>
+ 
+@@ -1061,23 +1063,65 @@ static struct rockchip_clk_branch rk3528
+ 			0, 1, 1),
+ };
+ 
++static struct rockchip_clk_branch rk3528_vo_clk_branches[] __initdata = {
++	MMC_GRF(SCLK_SDMMC_DRV, "sdmmc_drv", "cclk_src_sdmmc0",
++			RK3528_SDMMC_CON(0), 1, grf_type_vo),
++	MMC_GRF(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "cclk_src_sdmmc0",
++			RK3528_SDMMC_CON(1), 1, grf_type_vo),
++};
++
++static struct rockchip_clk_branch rk3528_vpu_clk_branches[] __initdata = {
++	MMC_GRF(SCLK_SDIO0_DRV, "sdio0_drv", "cclk_src_sdio0",
++			RK3528_SDIO0_CON(0), 1, grf_type_vpu),
++	MMC_GRF(SCLK_SDIO0_SAMPLE, "sdio0_sample", "cclk_src_sdio0",
++			RK3528_SDIO0_CON(1), 1, grf_type_vpu),
++	MMC_GRF(SCLK_SDIO1_DRV, "sdio1_drv", "cclk_src_sdio1",
++			RK3528_SDIO1_CON(0), 1, grf_type_vpu),
++	MMC_GRF(SCLK_SDIO1_SAMPLE, "sdio1_sample", "cclk_src_sdio1",
++			RK3528_SDIO1_CON(1), 1, grf_type_vpu),
++};
++
+ static int __init clk_rk3528_probe(struct platform_device *pdev)
+ {
+-	struct rockchip_clk_provider *ctx;
++	unsigned long nr_vpu_branches = ARRAY_SIZE(rk3528_vpu_clk_branches);
++	unsigned long nr_vo_branches = ARRAY_SIZE(rk3528_vo_clk_branches);
++	unsigned long nr_branches = ARRAY_SIZE(rk3528_clk_branches);
++	unsigned long nr_clks, nr_vo_clks, nr_vpu_clks;
++	struct rockchip_aux_grf *vo_grf_e, *vpu_grf_e;
++	struct regmap *vo_grf, *vpu_grf;
+ 	struct device *dev = &pdev->dev;
+ 	struct device_node *np = dev->of_node;
+-	unsigned long nr_branches = ARRAY_SIZE(rk3528_clk_branches);
+-	unsigned long nr_clks;
++	struct rockchip_clk_provider *ctx;
+ 	void __iomem *reg_base;
+ 
+-	nr_clks = rockchip_clk_find_max_clk_id(rk3528_clk_branches,
+-					       nr_branches) + 1;
+-
+ 	reg_base = devm_platform_ioremap_resource(pdev, 0);
+ 	if (IS_ERR(reg_base))
+ 		return dev_err_probe(dev, PTR_ERR(reg_base),
+ 				     "could not map cru region");
+ 
++	nr_clks = rockchip_clk_find_max_clk_id(rk3528_clk_branches,
++					       nr_branches) + 1;
++
++	vo_grf = syscon_regmap_lookup_by_compatible("rockchip,rk3528-vo-grf");
++	if (!IS_ERR(vo_grf)) {
++		nr_vo_clks = rockchip_clk_find_max_clk_id(rk3528_vo_clk_branches,
++							  nr_vo_branches) + 1;
++		nr_clks = max(nr_clks, nr_vo_clks);
++	} else if (PTR_ERR(vo_grf) != -ENODEV) {
++		return dev_err_probe(dev, PTR_ERR(vo_grf),
++				     "failed to look up VO GRF\n");
++	}
++
++	vpu_grf = syscon_regmap_lookup_by_compatible("rockchip,rk3528-vpu-grf");
++	if (!IS_ERR(vpu_grf)) {
++		nr_vpu_clks = rockchip_clk_find_max_clk_id(rk3528_vpu_clk_branches,
++							   nr_vpu_branches) + 1;
++		nr_clks = max(nr_clks, nr_vpu_clks);
++	} else if (PTR_ERR(vpu_grf) != -ENODEV) {
++		return dev_err_probe(dev, PTR_ERR(vpu_grf),
++				     "failed to look up VPU GRF\n");
++	}
++
+ 	ctx = rockchip_clk_init(np, reg_base, nr_clks);
+ 	if (IS_ERR(ctx))
+ 		return dev_err_probe(dev, PTR_ERR(ctx),
+@@ -1092,6 +1136,32 @@ static int __init clk_rk3528_probe(struc
+ 				     ARRAY_SIZE(rk3528_cpuclk_rates));
+ 	rockchip_clk_register_branches(ctx, rk3528_clk_branches, nr_branches);
+ 
++	if (!IS_ERR(vo_grf)) {
++		vo_grf_e = devm_kzalloc(dev, sizeof(*vo_grf_e), GFP_KERNEL);
++		if (!vo_grf_e)
++			return -ENOMEM;
++
++		vo_grf_e->grf	= vo_grf;
++		vo_grf_e->type	= grf_type_vo;
++		hash_add(ctx->aux_grf_table, &vo_grf_e->node, grf_type_vo);
++
++		rockchip_clk_register_branches(ctx, rk3528_vo_clk_branches,
++					       nr_vo_branches);
++	}
++
++	if (!IS_ERR(vpu_grf)) {
++		vpu_grf_e = devm_kzalloc(dev, sizeof(*vpu_grf_e), GFP_KERNEL);
++		if (!vpu_grf_e)
++			return -ENOMEM;
++
++		vpu_grf_e->grf	= vpu_grf;
++		vpu_grf_e->type	= grf_type_vpu;
++		hash_add(ctx->aux_grf_table, &vpu_grf_e->node, grf_type_vpu);
++
++		rockchip_clk_register_branches(ctx, rk3528_vpu_clk_branches,
++					       nr_vpu_branches);
++	}
++
+ 	rk3528_rst_init(np, reg_base);
+ 
+ 	rockchip_register_restart_notifier(ctx, RK3528_GLB_SRST_FST, NULL);
+--- a/drivers/clk/rockchip/clk.h
++++ b/drivers/clk/rockchip/clk.h
+@@ -218,6 +218,9 @@ struct clk;
+ #define RK3528_CLKSEL_CON(x)		((x) * 0x4 + 0x300)
+ #define RK3528_CLKGATE_CON(x)		((x) * 0x4 + 0x800)
+ #define RK3528_SOFTRST_CON(x)		((x) * 0x4 + 0xa00)
++#define RK3528_SDMMC_CON(x)		((x) * 0x4 + 0x24)
++#define RK3528_SDIO0_CON(x)		((x) * 0x4 + 0x4)
++#define RK3528_SDIO1_CON(x)		((x) * 0x4 + 0xc)
+ #define RK3528_PMU_CLKSEL_CON(x)	((x) * 0x4 + 0x300 + RK3528_PMU_CRU_BASE)
+ #define RK3528_PMU_CLKGATE_CON(x)	((x) * 0x4 + 0x800 + RK3528_PMU_CRU_BASE)
+ #define RK3528_PCIE_CLKSEL_CON(x)	((x) * 0x4 + 0x300 + RK3528_PCIE_CRU_BASE)
+@@ -407,6 +410,8 @@ enum rockchip_grf_type {
+ 	grf_type_pmu0,
+ 	grf_type_pmu1,
+ 	grf_type_ioc,
++	grf_type_vo,
++	grf_type_vpu,
+ };
+ 
+ /* ceil(sqrt(enums in rockchip_grf_type - 1)) */
diff --git a/target/linux/rockchip/patches-6.12/032-27-v6.16-clk-rockchip-rk3528-add-slab-h-header-include.patch b/target/linux/rockchip/patches-6.12/032-27-v6.16-clk-rockchip-rk3528-add-slab-h-header-include.patch
new file mode 100644
index 0000000000..1b03b1fd61
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/032-27-v6.16-clk-rockchip-rk3528-add-slab-h-header-include.patch
@@ -0,0 +1,30 @@
+From 276036283716b9135525b195675ea42801bde204 Mon Sep 17 00:00:00 2001
+From: Heiko Stuebner <heiko at sntech.de>
+Date: Thu, 15 May 2025 10:26:52 +0200
+Subject: [PATCH] clk: rockchip: rk3528: add slab.h header include
+
+The newly added GRF types introduced kzalloc usage into the rk3528.
+At least for the similar rk3576 driver, the kernel-test-robot reported the
+missing prototype, which warranted adding a slab.h include.
+
+While it did not complain about the rk3528, so the header might be included
+"accidentially" right now, add a real include to make sure we keep it
+included in the future.
+
+Fixes: 306d2f5ddaa7 ("clk: rockchip: rk3528: Add SD/SDIO tuning clocks in GRF region")
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+Link: https://lore.kernel.org/r/20250515082652.2503063-2-heiko@sntech.de
+---
+ drivers/clk/rockchip/clk-rk3528.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/clk/rockchip/clk-rk3528.c
++++ b/drivers/clk/rockchip/clk-rk3528.c
+@@ -12,6 +12,7 @@
+ #include <linux/platform_device.h>
+ #include <linux/mfd/syscon.h>
+ #include <linux/minmax.h>
++#include <linux/slab.h>
+ 
+ #include <dt-bindings/clock/rockchip,rk3528-cru.h>
+ 
diff --git a/target/linux/rockchip/patches-6.12/032-28-v6.17-dt-bindings-power-rockchip-Add-support-for-RK3528.patch b/target/linux/rockchip/patches-6.12/032-28-v6.17-dt-bindings-power-rockchip-Add-support-for-RK3528.patch
new file mode 100644
index 0000000000..d235a4c2c1
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/032-28-v6.17-dt-bindings-power-rockchip-Add-support-for-RK3528.patch
@@ -0,0 +1,49 @@
+From 8358102806c619d8d6c814010173617fb374b77e Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Sun, 18 May 2025 22:06:48 +0000
+Subject: [PATCH] dt-bindings: power: rockchip: Add support for RK3528
+
+Add the compatible string and power domains for RK3528 SoC.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Acked-by: Conor Dooley <conor.dooley at microchip.com>
+Link: https://lore.kernel.org/r/20250518220707.669515-2-jonas@kwiboo.se
+Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>
+---
+ .../power/rockchip,power-controller.yaml      |  1 +
+ .../dt-bindings/power/rockchip,rk3528-power.h | 19 +++++++++++++++++++
+ 2 files changed, 20 insertions(+)
+ create mode 100644 include/dt-bindings/power/rockchip,rk3528-power.h
+
+--- a/Documentation/devicetree/bindings/power/rockchip,power-controller.yaml
++++ b/Documentation/devicetree/bindings/power/rockchip,power-controller.yaml
+@@ -40,6 +40,7 @@ properties:
+       - rockchip,rk3366-power-controller
+       - rockchip,rk3368-power-controller
+       - rockchip,rk3399-power-controller
++      - rockchip,rk3528-power-controller
+       - rockchip,rk3568-power-controller
+       - rockchip,rk3576-power-controller
+       - rockchip,rk3588-power-controller
+--- /dev/null
++++ b/include/dt-bindings/power/rockchip,rk3528-power.h
+@@ -0,0 +1,19 @@
++/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
++#ifndef __DT_BINDINGS_POWER_RK3528_POWER_H__
++#define __DT_BINDINGS_POWER_RK3528_POWER_H__
++
++#define RK3528_PD_PMU		0
++#define RK3528_PD_BUS		1
++#define RK3528_PD_DDR		2
++#define RK3528_PD_MSCH		3
++
++/* VD_GPU */
++#define RK3528_PD_GPU		4
++
++/* VD_LOGIC */
++#define RK3528_PD_RKVDEC	5
++#define RK3528_PD_RKVENC	6
++#define RK3528_PD_VO		7
++#define RK3528_PD_VPU		8
++
++#endif
diff --git a/target/linux/rockchip/patches-6.12/033-04-v6.17-pmdomain-rockchip-Add-support-for-RK3528.patch b/target/linux/rockchip/patches-6.12/033-04-v6.17-pmdomain-rockchip-Add-support-for-RK3528.patch
new file mode 100644
index 0000000000..8d06cc6385
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/033-04-v6.17-pmdomain-rockchip-Add-support-for-RK3528.patch
@@ -0,0 +1,81 @@
+From 3068b386232f0a7d84da6d1366dbd0b7926c5652 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Sun, 18 May 2025 22:06:49 +0000
+Subject: [PATCH] pmdomain: rockchip: Add support for RK3528
+
+Add configuration and power domains for RK3528 SoC.
+
+Only PD_GPU can fully be powered down. PD_RKVDEC, PD_RKVENC, PD_VO and
+PD_VPU are used by miscellaneous devices in RK3528.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250518220707.669515-3-jonas@kwiboo.se
+Signed-off-by: Ulf Hansson <ulf.hansson at linaro.org>
+---
+ drivers/pmdomain/rockchip/pm-domains.c | 27 ++++++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+--- a/drivers/pmdomain/rockchip/pm-domains.c
++++ b/drivers/pmdomain/rockchip/pm-domains.c
+@@ -34,6 +34,7 @@
+ #include <dt-bindings/power/rk3366-power.h>
+ #include <dt-bindings/power/rk3368-power.h>
+ #include <dt-bindings/power/rk3399-power.h>
++#include <dt-bindings/power/rockchip,rk3528-power.h>
+ #include <dt-bindings/power/rk3568-power.h>
+ #include <dt-bindings/power/rockchip,rk3576-power.h>
+ #include <dt-bindings/power/rk3588-power.h>
+@@ -196,6 +197,9 @@ struct rockchip_pmu {
+ #define DOMAIN_RK3399(name, pwr, status, req, wakeup)		\
+ 	DOMAIN(name, pwr, status, req, req, req, wakeup)
+ 
++#define DOMAIN_RK3528(name, pwr, req)		\
++	DOMAIN_M(name, pwr, pwr, req, req, req, false)
++
+ #define DOMAIN_RK3568(name, pwr, req, wakeup)		\
+ 	DOMAIN_M(name, pwr, pwr, req, req, req, wakeup)
+ 
+@@ -1139,6 +1143,14 @@ static const struct rockchip_domain_info
+ 	[RK3399_PD_SDIOAUDIO]	= DOMAIN_RK3399("sdioaudio", BIT(31), BIT(31), BIT(29), true),
+ };
+ 
++static const struct rockchip_domain_info rk3528_pm_domains[] = {
++	[RK3528_PD_GPU]		= DOMAIN_RK3528("gpu",  BIT(0), BIT(4)),
++	[RK3528_PD_RKVDEC]	= DOMAIN_RK3528("vdec",      0, BIT(5)),
++	[RK3528_PD_RKVENC]	= DOMAIN_RK3528("venc",      0, BIT(6)),
++	[RK3528_PD_VO]		= DOMAIN_RK3528("vo",        0, BIT(7)),
++	[RK3528_PD_VPU]		= DOMAIN_RK3528("vpu",       0, BIT(8)),
++};
++
+ static const struct rockchip_domain_info rk3568_pm_domains[] = {
+ 	[RK3568_PD_NPU]		= DOMAIN_RK3568("npu",  BIT(1), BIT(2),  false),
+ 	[RK3568_PD_GPU]		= DOMAIN_RK3568("gpu",  BIT(0), BIT(1),  false),
+@@ -1340,6 +1352,17 @@ static const struct rockchip_pmu_info rk
+ 	.domain_info = rk3399_pm_domains,
+ };
+ 
++static const struct rockchip_pmu_info rk3528_pmu = {
++	.pwr_offset = 0x1210,
++	.status_offset = 0x1230,
++	.req_offset = 0x1110,
++	.idle_offset = 0x1128,
++	.ack_offset = 0x1120,
++
++	.num_domains = ARRAY_SIZE(rk3528_pm_domains),
++	.domain_info = rk3528_pm_domains,
++};
++
+ static const struct rockchip_pmu_info rk3568_pmu = {
+ 	.pwr_offset = 0xa0,
+ 	.status_offset = 0x98,
+@@ -1439,6 +1462,10 @@ static const struct of_device_id rockchi
+ 		.data = (void *)&rk3399_pmu,
+ 	},
+ 	{
++		.compatible = "rockchip,rk3528-power-controller",
++		.data = (void *)&rk3528_pmu,
++	},
++	{
+ 		.compatible = "rockchip,rk3568-power-controller",
+ 		.data = (void *)&rk3568_pmu,
+ 	},
diff --git a/target/linux/rockchip/patches-6.12/036-07-v6.18-phy-rockchip-naneng-combphy-Add-SoC-prefix-to-register.patch b/target/linux/rockchip/patches-6.12/036-07-v6.18-phy-rockchip-naneng-combphy-Add-SoC-prefix-to-register.patch
new file mode 100644
index 0000000000..8ad4bb5516
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/036-07-v6.18-phy-rockchip-naneng-combphy-Add-SoC-prefix-to-register.patch
@@ -0,0 +1,758 @@
+From 11f1896e60f61ca1948cb7920585a79ce5254c0c Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Mon, 28 Jul 2025 10:29:46 +0000
+Subject: [PATCH] phy: rockchip: naneng-combphy: Add SoC prefix to register
+ definitions
+
+All supported variants of naneng-combphy follow a register layout
+similar to the RK3568 variant with some exceptions of SoC-specific
+registers.
+
+Add RK3568 prefix for the common set of registers and the corresponding
+SoC prefix for SoC-specific registers, making usage of definitions clear
+and preparing for future COMBPHY variants with a different register
+layout.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Reviewed-by: Heiko Stuebner <heiko at sntech.de>
+Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>
+Link: https://lore.kernel.org/r/20250728102947.38984-6-ziyao@disroot.org
+Signed-off-by: Vinod Koul <vkoul at kernel.org>
+---
+ .../rockchip/phy-rockchip-naneng-combphy.c    | 560 +++++++++---------
+ 1 file changed, 288 insertions(+), 272 deletions(-)
+
+--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
++++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
+@@ -21,78 +21,80 @@
+ #define REF_CLOCK_100MHz		(100 * HZ_PER_MHZ)
+ 
+ /* COMBO PHY REG */
+-#define PHYREG6				0x14
+-#define PHYREG6_PLL_DIV_MASK		GENMASK(7, 6)
+-#define PHYREG6_PLL_DIV_SHIFT		6
+-#define PHYREG6_PLL_DIV_2		1
+-
+-#define PHYREG7				0x18
+-#define PHYREG7_TX_RTERM_MASK		GENMASK(7, 4)
+-#define PHYREG7_TX_RTERM_SHIFT		4
+-#define PHYREG7_TX_RTERM_50OHM		8
+-#define PHYREG7_RX_RTERM_MASK		GENMASK(3, 0)
+-#define PHYREG7_RX_RTERM_SHIFT		0
+-#define PHYREG7_RX_RTERM_44OHM		15
+-
+-#define PHYREG8				0x1C
+-#define PHYREG8_SSC_EN			BIT(4)
+-
+-#define PHYREG10			0x24
+-#define PHYREG10_SSC_PCM_MASK		GENMASK(3, 0)
+-#define PHYREG10_SSC_PCM_3500PPM	7
+-
+-#define PHYREG11			0x28
+-#define PHYREG11_SU_TRIM_0_7		0xF0
+-
+-#define PHYREG12			0x2C
+-#define PHYREG12_PLL_LPF_ADJ_VALUE	4
+-
+-#define PHYREG13			0x30
+-#define PHYREG13_RESISTER_MASK		GENMASK(5, 4)
+-#define PHYREG13_RESISTER_SHIFT		0x4
+-#define PHYREG13_RESISTER_HIGH_Z	3
+-#define PHYREG13_CKRCV_AMP0		BIT(7)
+-
+-#define PHYREG14			0x34
+-#define PHYREG14_CKRCV_AMP1		BIT(0)
+-
+-#define PHYREG15			0x38
+-#define PHYREG15_CTLE_EN		BIT(0)
+-#define PHYREG15_SSC_CNT_MASK		GENMASK(7, 6)
+-#define PHYREG15_SSC_CNT_SHIFT		6
+-#define PHYREG15_SSC_CNT_VALUE		1
+-
+-#define PHYREG16			0x3C
+-#define PHYREG16_SSC_CNT_VALUE		0x5f
+-
+-#define PHYREG17			0x40
+-
+-#define PHYREG18			0x44
+-#define PHYREG18_PLL_LOOP		0x32
+-
+-#define PHYREG21			0x50
+-#define PHYREG21_RX_SQUELCH_VAL		0x0D
+-
+-#define PHYREG27			0x6C
+-#define PHYREG27_RX_TRIM_RK3588		0x4C
+-
+-#define PHYREG30			0x74
+-
+-#define PHYREG32			0x7C
+-#define PHYREG32_SSC_MASK		GENMASK(7, 4)
+-#define PHYREG32_SSC_DIR_MASK		GENMASK(5, 4)
+-#define PHYREG32_SSC_DIR_SHIFT		4
+-#define PHYREG32_SSC_UPWARD		0
+-#define PHYREG32_SSC_DOWNWARD		1
+-#define PHYREG32_SSC_OFFSET_MASK	GENMASK(7, 6)
+-#define PHYREG32_SSC_OFFSET_SHIFT	6
+-#define PHYREG32_SSC_OFFSET_500PPM	1
+-
+-#define PHYREG33			0x80
+-#define PHYREG33_PLL_KVCO_MASK		GENMASK(4, 2)
+-#define PHYREG33_PLL_KVCO_SHIFT		2
+-#define PHYREG33_PLL_KVCO_VALUE		2
+-#define PHYREG33_PLL_KVCO_VALUE_RK3576	4
++#define RK3568_PHYREG6				0x14
++#define RK3568_PHYREG6_PLL_DIV_MASK		GENMASK(7, 6)
++#define RK3568_PHYREG6_PLL_DIV_SHIFT		6
++#define RK3568_PHYREG6_PLL_DIV_2		1
++
++#define RK3568_PHYREG7				0x18
++#define RK3568_PHYREG7_TX_RTERM_MASK		GENMASK(7, 4)
++#define RK3568_PHYREG7_TX_RTERM_SHIFT		4
++#define RK3568_PHYREG7_TX_RTERM_50OHM		8
++#define RK3568_PHYREG7_RX_RTERM_MASK		GENMASK(3, 0)
++#define RK3568_PHYREG7_RX_RTERM_SHIFT		0
++#define RK3568_PHYREG7_RX_RTERM_44OHM		15
++
++#define RK3568_PHYREG8				0x1C
++#define RK3568_PHYREG8_SSC_EN			BIT(4)
++
++#define RK3568_PHYREG11				0x28
++#define RK3568_PHYREG11_SU_TRIM_0_7		0xF0
++
++#define RK3568_PHYREG12				0x2C
++#define RK3568_PHYREG12_PLL_LPF_ADJ_VALUE	4
++
++#define RK3568_PHYREG13				0x30
++#define RK3568_PHYREG13_RESISTER_MASK		GENMASK(5, 4)
++#define RK3568_PHYREG13_RESISTER_SHIFT		0x4
++#define RK3568_PHYREG13_RESISTER_HIGH_Z		3
++#define RK3568_PHYREG13_CKRCV_AMP0		BIT(7)
++
++#define RK3568_PHYREG14				0x34
++#define RK3568_PHYREG14_CKRCV_AMP1		BIT(0)
++
++#define RK3568_PHYREG15				0x38
++#define RK3568_PHYREG15_CTLE_EN			BIT(0)
++#define RK3568_PHYREG15_SSC_CNT_MASK		GENMASK(7, 6)
++#define RK3568_PHYREG15_SSC_CNT_SHIFT		6
++#define RK3568_PHYREG15_SSC_CNT_VALUE		1
++
++#define RK3568_PHYREG16				0x3C
++#define RK3568_PHYREG16_SSC_CNT_VALUE		0x5f
++
++#define RK3568_PHYREG18				0x44
++#define RK3568_PHYREG18_PLL_LOOP		0x32
++
++#define RK3568_PHYREG32				0x7C
++#define RK3568_PHYREG32_SSC_MASK		GENMASK(7, 4)
++#define RK3568_PHYREG32_SSC_DIR_MASK		GENMASK(5, 4)
++#define RK3568_PHYREG32_SSC_DIR_SHIFT		4
++#define RK3568_PHYREG32_SSC_UPWARD		0
++#define RK3568_PHYREG32_SSC_DOWNWARD		1
++#define RK3568_PHYREG32_SSC_OFFSET_MASK	GENMASK(7, 6)
++#define RK3568_PHYREG32_SSC_OFFSET_SHIFT	6
++#define RK3568_PHYREG32_SSC_OFFSET_500PPM	1
++
++#define RK3568_PHYREG33				0x80
++#define RK3568_PHYREG33_PLL_KVCO_MASK		GENMASK(4, 2)
++#define RK3568_PHYREG33_PLL_KVCO_SHIFT		2
++#define RK3568_PHYREG33_PLL_KVCO_VALUE		2
++#define RK3576_PHYREG33_PLL_KVCO_VALUE		4
++
++/* RK3588 COMBO PHY registers */
++#define RK3588_PHYREG27				0x6C
++#define RK3588_PHYREG27_RX_TRIM			0x4C
++
++/* RK3576 COMBO PHY registers */
++#define RK3576_PHYREG10				0x24
++#define RK3576_PHYREG10_SSC_PCM_MASK		GENMASK(3, 0)
++#define RK3576_PHYREG10_SSC_PCM_3500PPM		7
++
++#define RK3576_PHYREG17				0x40
++
++#define RK3576_PHYREG21				0x50
++#define RK3576_PHYREG21_RX_SQUELCH_VAL		0x0D
++
++#define RK3576_PHYREG30				0x74
+ 
+ struct rockchip_combphy_priv;
+ 
+@@ -407,9 +409,9 @@ static int rk3568_combphy_cfg(struct roc
+ 	switch (priv->type) {
+ 	case PHY_TYPE_PCIE:
+ 		/* Set SSC downward spread spectrum. */
+-		rockchip_combphy_updatel(priv, PHYREG32_SSC_MASK,
+-					 PHYREG32_SSC_DOWNWARD << PHYREG32_SSC_DIR_SHIFT,
+-					 PHYREG32);
++		val = RK3568_PHYREG32_SSC_DOWNWARD << RK3568_PHYREG32_SSC_DIR_SHIFT;
++
++		rockchip_combphy_updatel(priv, RK3568_PHYREG32_SSC_MASK, val, RK3568_PHYREG32);
+ 
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->con0_for_pcie, true);
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->con1_for_pcie, true);
+@@ -419,30 +421,28 @@ static int rk3568_combphy_cfg(struct roc
+ 
+ 	case PHY_TYPE_USB3:
+ 		/* Set SSC downward spread spectrum. */
+-		rockchip_combphy_updatel(priv, PHYREG32_SSC_MASK,
+-					 PHYREG32_SSC_DOWNWARD << PHYREG32_SSC_DIR_SHIFT,
+-					 PHYREG32);
++		val = RK3568_PHYREG32_SSC_DOWNWARD << RK3568_PHYREG32_SSC_DIR_SHIFT,
++		rockchip_combphy_updatel(priv, RK3568_PHYREG32_SSC_MASK, val, RK3568_PHYREG32);
+ 
+ 		/* Enable adaptive CTLE for USB3.0 Rx. */
+-		val = readl(priv->mmio + PHYREG15);
+-		val |= PHYREG15_CTLE_EN;
+-		writel(val, priv->mmio + PHYREG15);
++		val = readl(priv->mmio + RK3568_PHYREG15);
++		val |= RK3568_PHYREG15_CTLE_EN;
++		writel(val, priv->mmio + RK3568_PHYREG15);
+ 
+ 		/* Set PLL KVCO fine tuning signals. */
+-		rockchip_combphy_updatel(priv, PHYREG33_PLL_KVCO_MASK,
+-					 PHYREG33_PLL_KVCO_VALUE << PHYREG33_PLL_KVCO_SHIFT,
+-					 PHYREG33);
++		val = RK3568_PHYREG33_PLL_KVCO_VALUE << RK3568_PHYREG33_PLL_KVCO_SHIFT;
++		rockchip_combphy_updatel(priv, RK3568_PHYREG33_PLL_KVCO_MASK, val, RK3568_PHYREG33);
+ 
+ 		/* Enable controlling random jitter. */
+-		writel(PHYREG12_PLL_LPF_ADJ_VALUE, priv->mmio + PHYREG12);
++		writel(RK3568_PHYREG12_PLL_LPF_ADJ_VALUE, priv->mmio + RK3568_PHYREG12);
+ 
+ 		/* Set PLL input clock divider 1/2. */
+-		rockchip_combphy_updatel(priv, PHYREG6_PLL_DIV_MASK,
+-					 PHYREG6_PLL_DIV_2 << PHYREG6_PLL_DIV_SHIFT,
+-					 PHYREG6);
++		rockchip_combphy_updatel(priv, RK3568_PHYREG6_PLL_DIV_MASK,
++					 RK3568_PHYREG6_PLL_DIV_2 << RK3568_PHYREG6_PLL_DIV_SHIFT,
++					 RK3568_PHYREG6);
+ 
+-		writel(PHYREG18_PLL_LOOP, priv->mmio + PHYREG18);
+-		writel(PHYREG11_SU_TRIM_0_7, priv->mmio + PHYREG11);
++		writel(RK3568_PHYREG18_PLL_LOOP, priv->mmio + RK3568_PHYREG18);
++		writel(RK3568_PHYREG11_SU_TRIM_0_7, priv->mmio + RK3568_PHYREG11);
+ 
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_sel_usb, true);
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
+@@ -460,16 +460,16 @@ static int rk3568_combphy_cfg(struct roc
+ 
+ 	case PHY_TYPE_SATA:
+ 		/* Enable adaptive CTLE for SATA Rx. */
+-		val = readl(priv->mmio + PHYREG15);
+-		val |= PHYREG15_CTLE_EN;
+-		writel(val, priv->mmio + PHYREG15);
++		val = readl(priv->mmio + RK3568_PHYREG15);
++		val |= RK3568_PHYREG15_CTLE_EN;
++		writel(val, priv->mmio + RK3568_PHYREG15);
+ 		/*
+ 		 * Set tx_rterm=50ohm and rx_rterm=44ohm for SATA.
+ 		 * 0: 60ohm, 8: 50ohm 15: 44ohm (by step abort 1ohm)
+ 		 */
+-		val = PHYREG7_TX_RTERM_50OHM << PHYREG7_TX_RTERM_SHIFT;
+-		val |= PHYREG7_RX_RTERM_44OHM << PHYREG7_RX_RTERM_SHIFT;
+-		writel(val, priv->mmio + PHYREG7);
++		val = RK3568_PHYREG7_TX_RTERM_50OHM << RK3568_PHYREG7_TX_RTERM_SHIFT;
++		val |= RK3568_PHYREG7_RX_RTERM_44OHM << RK3568_PHYREG7_RX_RTERM_SHIFT;
++		writel(val, priv->mmio + RK3568_PHYREG7);
+ 
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->con0_for_sata, true);
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->con1_for_sata, true);
+@@ -504,11 +504,11 @@ static int rk3568_combphy_cfg(struct roc
+ 	case REF_CLOCK_24MHz:
+ 		if (priv->type == PHY_TYPE_USB3 || priv->type == PHY_TYPE_SATA) {
+ 			/* Set ssc_cnt[9:0]=0101111101 & 31.5KHz. */
+-			val = PHYREG15_SSC_CNT_VALUE << PHYREG15_SSC_CNT_SHIFT;
+-			rockchip_combphy_updatel(priv, PHYREG15_SSC_CNT_MASK,
+-						 val, PHYREG15);
++			val = RK3568_PHYREG15_SSC_CNT_VALUE << RK3568_PHYREG15_SSC_CNT_SHIFT;
++			rockchip_combphy_updatel(priv, RK3568_PHYREG15_SSC_CNT_MASK,
++						 val, RK3568_PHYREG15);
+ 
+-			writel(PHYREG16_SSC_CNT_VALUE, priv->mmio + PHYREG16);
++			writel(RK3568_PHYREG16_SSC_CNT_VALUE, priv->mmio + RK3568_PHYREG16);
+ 		}
+ 		break;
+ 
+@@ -520,24 +520,26 @@ static int rk3568_combphy_cfg(struct roc
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_100m, true);
+ 		if (priv->type == PHY_TYPE_PCIE) {
+ 			/* PLL KVCO  fine tuning. */
+-			val = PHYREG33_PLL_KVCO_VALUE << PHYREG33_PLL_KVCO_SHIFT;
+-			rockchip_combphy_updatel(priv, PHYREG33_PLL_KVCO_MASK,
+-						 val, PHYREG33);
++			val = RK3568_PHYREG33_PLL_KVCO_VALUE << RK3568_PHYREG33_PLL_KVCO_SHIFT;
++			rockchip_combphy_updatel(priv, RK3568_PHYREG33_PLL_KVCO_MASK,
++						 val, RK3568_PHYREG33);
+ 
+ 			/* Enable controlling random jitter. */
+-			writel(PHYREG12_PLL_LPF_ADJ_VALUE, priv->mmio + PHYREG12);
++			writel(RK3568_PHYREG12_PLL_LPF_ADJ_VALUE, priv->mmio + RK3568_PHYREG12);
+ 
+-			val = PHYREG6_PLL_DIV_2 << PHYREG6_PLL_DIV_SHIFT;
+-			rockchip_combphy_updatel(priv, PHYREG6_PLL_DIV_MASK,
+-						 val, PHYREG6);
++			val = RK3568_PHYREG6_PLL_DIV_2 << RK3568_PHYREG6_PLL_DIV_SHIFT;
++			rockchip_combphy_updatel(priv, RK3568_PHYREG6_PLL_DIV_MASK,
++						 val, RK3568_PHYREG6);
+ 
+-			writel(PHYREG18_PLL_LOOP, priv->mmio + PHYREG18);
+-			writel(PHYREG11_SU_TRIM_0_7, priv->mmio + PHYREG11);
++			writel(RK3568_PHYREG18_PLL_LOOP, priv->mmio + RK3568_PHYREG18);
++			writel(RK3568_PHYREG11_SU_TRIM_0_7, priv->mmio + RK3568_PHYREG11);
+ 		} else if (priv->type == PHY_TYPE_SATA) {
+ 			/* downward spread spectrum +500ppm */
+-			val = PHYREG32_SSC_DOWNWARD << PHYREG32_SSC_DIR_SHIFT;
+-			val |= PHYREG32_SSC_OFFSET_500PPM << PHYREG32_SSC_OFFSET_SHIFT;
+-			rockchip_combphy_updatel(priv, PHYREG32_SSC_MASK, val, PHYREG32);
++			val = RK3568_PHYREG32_SSC_DOWNWARD << RK3568_PHYREG32_SSC_DIR_SHIFT;
++			val |= RK3568_PHYREG32_SSC_OFFSET_500PPM <<
++			       RK3568_PHYREG32_SSC_OFFSET_SHIFT;
++			rockchip_combphy_updatel(priv, RK3568_PHYREG32_SSC_MASK, val,
++						 RK3568_PHYREG32);
+ 		}
+ 		break;
+ 
+@@ -549,20 +551,21 @@ static int rk3568_combphy_cfg(struct roc
+ 	if (priv->ext_refclk) {
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_ext, true);
+ 		if (priv->type == PHY_TYPE_PCIE && rate == REF_CLOCK_100MHz) {
+-			val = PHYREG13_RESISTER_HIGH_Z << PHYREG13_RESISTER_SHIFT;
+-			val |= PHYREG13_CKRCV_AMP0;
+-			rockchip_combphy_updatel(priv, PHYREG13_RESISTER_MASK, val, PHYREG13);
+-
+-			val = readl(priv->mmio + PHYREG14);
+-			val |= PHYREG14_CKRCV_AMP1;
+-			writel(val, priv->mmio + PHYREG14);
++			val = RK3568_PHYREG13_RESISTER_HIGH_Z << RK3568_PHYREG13_RESISTER_SHIFT;
++			val |= RK3568_PHYREG13_CKRCV_AMP0;
++			rockchip_combphy_updatel(priv, RK3568_PHYREG13_RESISTER_MASK, val,
++						 RK3568_PHYREG13);
++
++			val = readl(priv->mmio + RK3568_PHYREG14);
++			val |= RK3568_PHYREG14_CKRCV_AMP1;
++			writel(val, priv->mmio + RK3568_PHYREG14);
+ 		}
+ 	}
+ 
+ 	if (priv->enable_ssc) {
+-		val = readl(priv->mmio + PHYREG8);
+-		val |= PHYREG8_SSC_EN;
+-		writel(val, priv->mmio + PHYREG8);
++		val = readl(priv->mmio + RK3568_PHYREG8);
++		val |= RK3568_PHYREG8_SSC_EN;
++		writel(val, priv->mmio + RK3568_PHYREG8);
+ 	}
+ 
+ 	return 0;
+@@ -623,8 +626,8 @@ static int rk3576_combphy_cfg(struct roc
+ 	switch (priv->type) {
+ 	case PHY_TYPE_PCIE:
+ 		/* Set SSC downward spread spectrum */
+-		val = FIELD_PREP(PHYREG32_SSC_MASK, PHYREG32_SSC_DOWNWARD);
+-		rockchip_combphy_updatel(priv, PHYREG32_SSC_MASK, val, PHYREG32);
++		val = FIELD_PREP(RK3568_PHYREG32_SSC_MASK, RK3568_PHYREG32_SSC_DOWNWARD);
++		rockchip_combphy_updatel(priv, RK3568_PHYREG32_SSC_MASK, val, RK3568_PHYREG32);
+ 
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->con0_for_pcie, true);
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->con1_for_pcie, true);
+@@ -634,32 +637,33 @@ static int rk3576_combphy_cfg(struct roc
+ 
+ 	case PHY_TYPE_USB3:
+ 		/* Set SSC downward spread spectrum */
+-		val = FIELD_PREP(PHYREG32_SSC_MASK, PHYREG32_SSC_DOWNWARD);
+-		rockchip_combphy_updatel(priv, PHYREG32_SSC_MASK, val, PHYREG32);
++		val = FIELD_PREP(RK3568_PHYREG32_SSC_MASK, RK3568_PHYREG32_SSC_DOWNWARD);
++		rockchip_combphy_updatel(priv, RK3568_PHYREG32_SSC_MASK, val, RK3568_PHYREG32);
+ 
+ 		/* Enable adaptive CTLE for USB3.0 Rx */
+-		val = readl(priv->mmio + PHYREG15);
+-		val |= PHYREG15_CTLE_EN;
+-		writel(val, priv->mmio + PHYREG15);
++		val = readl(priv->mmio + RK3568_PHYREG15);
++		val |= RK3568_PHYREG15_CTLE_EN;
++		writel(val, priv->mmio + RK3568_PHYREG15);
+ 
+ 		/* Set PLL KVCO fine tuning signals */
+-		rockchip_combphy_updatel(priv, PHYREG33_PLL_KVCO_MASK, BIT(3), PHYREG33);
++		rockchip_combphy_updatel(priv, RK3568_PHYREG33_PLL_KVCO_MASK, BIT(3),
++					 RK3568_PHYREG33);
+ 
+ 		/* Set PLL LPF R1 to su_trim[10:7]=1001 */
+-		writel(PHYREG12_PLL_LPF_ADJ_VALUE, priv->mmio + PHYREG12);
++		writel(RK3568_PHYREG12_PLL_LPF_ADJ_VALUE, priv->mmio + RK3568_PHYREG12);
+ 
+ 		/* Set PLL input clock divider 1/2 */
+-		val = FIELD_PREP(PHYREG6_PLL_DIV_MASK, PHYREG6_PLL_DIV_2);
+-		rockchip_combphy_updatel(priv, PHYREG6_PLL_DIV_MASK, val, PHYREG6);
++		val = FIELD_PREP(RK3568_PHYREG6_PLL_DIV_MASK, RK3568_PHYREG6_PLL_DIV_2);
++		rockchip_combphy_updatel(priv, RK3568_PHYREG6_PLL_DIV_MASK, val, RK3568_PHYREG6);
+ 
+ 		/* Set PLL loop divider */
+-		writel(PHYREG18_PLL_LOOP, priv->mmio + PHYREG18);
++		writel(RK3568_PHYREG18_PLL_LOOP, priv->mmio + RK3568_PHYREG18);
+ 
+ 		/* Set PLL KVCO to min and set PLL charge pump current to max */
+-		writel(PHYREG11_SU_TRIM_0_7, priv->mmio + PHYREG11);
++		writel(RK3568_PHYREG11_SU_TRIM_0_7, priv->mmio + RK3568_PHYREG11);
+ 
+ 		/* Set Rx squelch input filler bandwidth */
+-		writel(PHYREG21_RX_SQUELCH_VAL, priv->mmio + PHYREG21);
++		writel(RK3576_PHYREG21_RX_SQUELCH_VAL, priv->mmio + RK3576_PHYREG21);
+ 
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false);
+@@ -668,14 +672,14 @@ static int rk3576_combphy_cfg(struct roc
+ 
+ 	case PHY_TYPE_SATA:
+ 		/* Enable adaptive CTLE for SATA Rx */
+-		val = readl(priv->mmio + PHYREG15);
+-		val |= PHYREG15_CTLE_EN;
+-		writel(val, priv->mmio + PHYREG15);
++		val = readl(priv->mmio + RK3568_PHYREG15);
++		val |= RK3568_PHYREG15_CTLE_EN;
++		writel(val, priv->mmio + RK3568_PHYREG15);
+ 
+ 		/* Set tx_rterm = 50 ohm and rx_rterm = 43.5 ohm */
+-		val = PHYREG7_TX_RTERM_50OHM << PHYREG7_TX_RTERM_SHIFT;
+-		val |= PHYREG7_RX_RTERM_44OHM << PHYREG7_RX_RTERM_SHIFT;
+-		writel(val, priv->mmio + PHYREG7);
++		val = RK3568_PHYREG7_TX_RTERM_50OHM << RK3568_PHYREG7_TX_RTERM_SHIFT;
++		val |= RK3568_PHYREG7_RX_RTERM_44OHM << RK3568_PHYREG7_RX_RTERM_SHIFT;
++		writel(val, priv->mmio + RK3568_PHYREG7);
+ 
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->con0_for_sata, true);
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->con1_for_sata, true);
+@@ -697,19 +701,21 @@ static int rk3576_combphy_cfg(struct roc
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_24m, true);
+ 		if (priv->type == PHY_TYPE_USB3 || priv->type == PHY_TYPE_SATA) {
+ 			/* Set ssc_cnt[9:0]=0101111101 & 31.5KHz */
+-			val = FIELD_PREP(PHYREG15_SSC_CNT_MASK, PHYREG15_SSC_CNT_VALUE);
+-			rockchip_combphy_updatel(priv, PHYREG15_SSC_CNT_MASK,
+-						 val, PHYREG15);
++			val = FIELD_PREP(RK3568_PHYREG15_SSC_CNT_MASK,
++					 RK3568_PHYREG15_SSC_CNT_VALUE);
++			rockchip_combphy_updatel(priv, RK3568_PHYREG15_SSC_CNT_MASK,
++						 val, RK3568_PHYREG15);
+ 
+-			writel(PHYREG16_SSC_CNT_VALUE, priv->mmio + PHYREG16);
++			writel(RK3568_PHYREG16_SSC_CNT_VALUE, priv->mmio + RK3568_PHYREG16);
+ 		} else if (priv->type == PHY_TYPE_PCIE) {
+ 			/* PLL KVCO tuning fine */
+-			val = FIELD_PREP(PHYREG33_PLL_KVCO_MASK, PHYREG33_PLL_KVCO_VALUE_RK3576);
+-			rockchip_combphy_updatel(priv, PHYREG33_PLL_KVCO_MASK,
+-						 val, PHYREG33);
++			val = FIELD_PREP(RK3568_PHYREG33_PLL_KVCO_MASK,
++					 RK3576_PHYREG33_PLL_KVCO_VALUE);
++			rockchip_combphy_updatel(priv, RK3568_PHYREG33_PLL_KVCO_MASK,
++						 val, RK3568_PHYREG33);
+ 
+ 			/* Set up rx_pck invert and rx msb to disable */
+-			writel(0x00, priv->mmio + PHYREG27);
++			writel(0x00, priv->mmio + RK3588_PHYREG27);
+ 
+ 			/*
+ 			 * Set up SU adjust signal:
+@@ -717,11 +723,11 @@ static int rk3576_combphy_cfg(struct roc
+ 			 * su_trim[15:8],  PLL LPF R1 adujst bits[9:7]=3'b011
+ 			 * su_trim[31:24], CKDRV adjust
+ 			 */
+-			writel(0x90, priv->mmio + PHYREG11);
+-			writel(0x02, priv->mmio + PHYREG12);
+-			writel(0x57, priv->mmio + PHYREG14);
++			writel(0x90, priv->mmio + RK3568_PHYREG11);
++			writel(0x02, priv->mmio + RK3568_PHYREG12);
++			writel(0x57, priv->mmio + RK3568_PHYREG14);
+ 
+-			writel(PHYREG16_SSC_CNT_VALUE, priv->mmio + PHYREG16);
++			writel(RK3568_PHYREG16_SSC_CNT_VALUE, priv->mmio + RK3568_PHYREG16);
+ 		}
+ 		break;
+ 
+@@ -733,15 +739,16 @@ static int rk3576_combphy_cfg(struct roc
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_100m, true);
+ 		if (priv->type == PHY_TYPE_PCIE) {
+ 			/* gate_tx_pck_sel length select work for L1SS */
+-			writel(0xc0, priv->mmio + PHYREG30);
++			writel(0xc0, priv->mmio + RK3576_PHYREG30);
+ 
+ 			/* PLL KVCO tuning fine */
+-			val = FIELD_PREP(PHYREG33_PLL_KVCO_MASK, PHYREG33_PLL_KVCO_VALUE_RK3576);
+-			rockchip_combphy_updatel(priv, PHYREG33_PLL_KVCO_MASK,
+-						 val, PHYREG33);
++			val = FIELD_PREP(RK3568_PHYREG33_PLL_KVCO_MASK,
++					 RK3576_PHYREG33_PLL_KVCO_VALUE);
++			rockchip_combphy_updatel(priv, RK3568_PHYREG33_PLL_KVCO_MASK,
++						 val, RK3568_PHYREG33);
+ 
+ 			/* Set up rx_trim: PLL LPF C1 85pf R1 1.25kohm */
+-			writel(0x4c, priv->mmio + PHYREG27);
++			writel(0x4c, priv->mmio + RK3588_PHYREG27);
+ 
+ 			/*
+ 			 * Set up SU adjust signal:
+@@ -751,20 +758,23 @@ static int rk3576_combphy_cfg(struct roc
+ 			 * su_trim[23:16], CKRCV adjust
+ 			 * su_trim[31:24], CKDRV adjust
+ 			 */
+-			writel(0x90, priv->mmio + PHYREG11);
+-			writel(0x43, priv->mmio + PHYREG12);
+-			writel(0x88, priv->mmio + PHYREG13);
+-			writel(0x56, priv->mmio + PHYREG14);
++			writel(0x90, priv->mmio + RK3568_PHYREG11);
++			writel(0x43, priv->mmio + RK3568_PHYREG12);
++			writel(0x88, priv->mmio + RK3568_PHYREG13);
++			writel(0x56, priv->mmio + RK3568_PHYREG14);
+ 		} else if (priv->type == PHY_TYPE_SATA) {
+ 			/* downward spread spectrum +500ppm */
+-			val = FIELD_PREP(PHYREG32_SSC_DIR_MASK, PHYREG32_SSC_DOWNWARD);
+-			val |= FIELD_PREP(PHYREG32_SSC_OFFSET_MASK, PHYREG32_SSC_OFFSET_500PPM);
+-			rockchip_combphy_updatel(priv, PHYREG32_SSC_MASK, val, PHYREG32);
++			val = FIELD_PREP(RK3568_PHYREG32_SSC_DIR_MASK,
++					 RK3568_PHYREG32_SSC_DOWNWARD);
++			val |= FIELD_PREP(RK3568_PHYREG32_SSC_OFFSET_MASK,
++					  RK3568_PHYREG32_SSC_OFFSET_500PPM);
++			rockchip_combphy_updatel(priv, RK3568_PHYREG32_SSC_MASK, val,
++						 RK3568_PHYREG32);
+ 
+ 			/* ssc ppm adjust to 3500ppm */
+-			rockchip_combphy_updatel(priv, PHYREG10_SSC_PCM_MASK,
+-						 PHYREG10_SSC_PCM_3500PPM,
+-						 PHYREG10);
++			rockchip_combphy_updatel(priv, RK3576_PHYREG10_SSC_PCM_MASK,
++						 RK3576_PHYREG10_SSC_PCM_3500PPM,
++						 RK3576_PHYREG10);
+ 		}
+ 		break;
+ 
+@@ -776,12 +786,13 @@ static int rk3576_combphy_cfg(struct roc
+ 	if (priv->ext_refclk) {
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_ext, true);
+ 		if (priv->type == PHY_TYPE_PCIE && rate == REF_CLOCK_100MHz) {
+-			val = FIELD_PREP(PHYREG33_PLL_KVCO_MASK, PHYREG33_PLL_KVCO_VALUE_RK3576);
+-			rockchip_combphy_updatel(priv, PHYREG33_PLL_KVCO_MASK,
+-						 val, PHYREG33);
++			val = FIELD_PREP(RK3568_PHYREG33_PLL_KVCO_MASK,
++					 RK3576_PHYREG33_PLL_KVCO_VALUE);
++			rockchip_combphy_updatel(priv, RK3568_PHYREG33_PLL_KVCO_MASK,
++						 val, RK3568_PHYREG33);
+ 
+ 			/* Set up rx_trim: PLL LPF C1 85pf R1 2.5kohm */
+-			writel(0x0c, priv->mmio + PHYREG27);
++			writel(0x0c, priv->mmio + RK3588_PHYREG27);
+ 
+ 			/*
+ 			 * Set up SU adjust signal:
+@@ -791,25 +802,25 @@ static int rk3576_combphy_cfg(struct roc
+ 			 * su_trim[23:16], CKRCV adjust
+ 			 * su_trim[31:24], CKDRV adjust
+ 			 */
+-			writel(0x90, priv->mmio + PHYREG11);
+-			writel(0x43, priv->mmio + PHYREG12);
+-			writel(0x88, priv->mmio + PHYREG13);
+-			writel(0x56, priv->mmio + PHYREG14);
++			writel(0x90, priv->mmio + RK3568_PHYREG11);
++			writel(0x43, priv->mmio + RK3568_PHYREG12);
++			writel(0x88, priv->mmio + RK3568_PHYREG13);
++			writel(0x56, priv->mmio + RK3568_PHYREG14);
+ 		}
+ 	}
+ 
+ 	if (priv->enable_ssc) {
+-		val = readl(priv->mmio + PHYREG8);
+-		val |= PHYREG8_SSC_EN;
+-		writel(val, priv->mmio + PHYREG8);
++		val = readl(priv->mmio + RK3568_PHYREG8);
++		val |= RK3568_PHYREG8_SSC_EN;
++		writel(val, priv->mmio + RK3568_PHYREG8);
+ 
+ 		if (priv->type == PHY_TYPE_PCIE && rate == REF_CLOCK_24MHz) {
+ 			/* Set PLL loop divider */
+-			writel(0x00, priv->mmio + PHYREG17);
+-			writel(PHYREG18_PLL_LOOP, priv->mmio + PHYREG18);
++			writel(0x00, priv->mmio + RK3576_PHYREG17);
++			writel(RK3568_PHYREG18_PLL_LOOP, priv->mmio + RK3568_PHYREG18);
+ 
+ 			/* Set up rx_pck invert and rx msb to disable */
+-			writel(0x00, priv->mmio + PHYREG27);
++			writel(0x00, priv->mmio + RK3588_PHYREG27);
+ 
+ 			/*
+ 			 * Set up SU adjust signal:
+@@ -818,16 +829,17 @@ static int rk3576_combphy_cfg(struct roc
+ 			 * su_trim[23:16], CKRCV adjust
+ 			 * su_trim[31:24], CKDRV adjust
+ 			 */
+-			writel(0x90, priv->mmio + PHYREG11);
+-			writel(0x02, priv->mmio + PHYREG12);
+-			writel(0x08, priv->mmio + PHYREG13);
+-			writel(0x57, priv->mmio + PHYREG14);
+-			writel(0x40, priv->mmio + PHYREG15);
+-
+-			writel(PHYREG16_SSC_CNT_VALUE, priv->mmio + PHYREG16);
+-
+-			val = FIELD_PREP(PHYREG33_PLL_KVCO_MASK, PHYREG33_PLL_KVCO_VALUE_RK3576);
+-			writel(val, priv->mmio + PHYREG33);
++			writel(0x90, priv->mmio + RK3568_PHYREG11);
++			writel(0x02, priv->mmio + RK3568_PHYREG12);
++			writel(0x08, priv->mmio + RK3568_PHYREG13);
++			writel(0x57, priv->mmio + RK3568_PHYREG14);
++			writel(0x40, priv->mmio + RK3568_PHYREG15);
++
++			writel(RK3568_PHYREG16_SSC_CNT_VALUE, priv->mmio + RK3568_PHYREG16);
++
++			val = FIELD_PREP(RK3568_PHYREG33_PLL_KVCO_MASK,
++					 RK3576_PHYREG33_PLL_KVCO_VALUE);
++			writel(val, priv->mmio + RK3568_PHYREG33);
+ 		}
+ 	}
+ 
+@@ -897,30 +909,28 @@ static int rk3588_combphy_cfg(struct roc
+ 		break;
+ 	case PHY_TYPE_USB3:
+ 		/* Set SSC downward spread spectrum */
+-		rockchip_combphy_updatel(priv, PHYREG32_SSC_MASK,
+-					 PHYREG32_SSC_DOWNWARD << PHYREG32_SSC_DIR_SHIFT,
+-					 PHYREG32);
++		val = RK3568_PHYREG32_SSC_DOWNWARD << RK3568_PHYREG32_SSC_DIR_SHIFT;
++		rockchip_combphy_updatel(priv, RK3568_PHYREG32_SSC_MASK, val, RK3568_PHYREG32);
+ 
+ 		/* Enable adaptive CTLE for USB3.0 Rx. */
+-		val = readl(priv->mmio + PHYREG15);
+-		val |= PHYREG15_CTLE_EN;
+-		writel(val, priv->mmio + PHYREG15);
++		val = readl(priv->mmio + RK3568_PHYREG15);
++		val |= RK3568_PHYREG15_CTLE_EN;
++		writel(val, priv->mmio + RK3568_PHYREG15);
+ 
+ 		/* Set PLL KVCO fine tuning signals. */
+-		rockchip_combphy_updatel(priv, PHYREG33_PLL_KVCO_MASK,
+-					 PHYREG33_PLL_KVCO_VALUE << PHYREG33_PLL_KVCO_SHIFT,
+-					 PHYREG33);
++		val = RK3568_PHYREG33_PLL_KVCO_VALUE << RK3568_PHYREG33_PLL_KVCO_SHIFT,
++		rockchip_combphy_updatel(priv, RK3568_PHYREG33_PLL_KVCO_MASK, val, RK3568_PHYREG33);
+ 
+ 		/* Enable controlling random jitter. */
+-		writel(PHYREG12_PLL_LPF_ADJ_VALUE, priv->mmio + PHYREG12);
++		writel(RK3568_PHYREG12_PLL_LPF_ADJ_VALUE, priv->mmio + RK3568_PHYREG12);
+ 
+ 		/* Set PLL input clock divider 1/2. */
+-		rockchip_combphy_updatel(priv, PHYREG6_PLL_DIV_MASK,
+-					 PHYREG6_PLL_DIV_2 << PHYREG6_PLL_DIV_SHIFT,
+-					 PHYREG6);
++		rockchip_combphy_updatel(priv, RK3568_PHYREG6_PLL_DIV_MASK,
++					 RK3568_PHYREG6_PLL_DIV_2 << RK3568_PHYREG6_PLL_DIV_SHIFT,
++					 RK3568_PHYREG6);
+ 
+-		writel(PHYREG18_PLL_LOOP, priv->mmio + PHYREG18);
+-		writel(PHYREG11_SU_TRIM_0_7, priv->mmio + PHYREG11);
++		writel(RK3568_PHYREG18_PLL_LOOP, priv->mmio + RK3568_PHYREG18);
++		writel(RK3568_PHYREG11_SU_TRIM_0_7, priv->mmio + RK3568_PHYREG11);
+ 
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false);
+@@ -928,16 +938,16 @@ static int rk3588_combphy_cfg(struct roc
+ 		break;
+ 	case PHY_TYPE_SATA:
+ 		/* Enable adaptive CTLE for SATA Rx. */
+-		val = readl(priv->mmio + PHYREG15);
+-		val |= PHYREG15_CTLE_EN;
+-		writel(val, priv->mmio + PHYREG15);
++		val = readl(priv->mmio + RK3568_PHYREG15);
++		val |= RK3568_PHYREG15_CTLE_EN;
++		writel(val, priv->mmio + RK3568_PHYREG15);
+ 		/*
+ 		 * Set tx_rterm=50ohm and rx_rterm=44ohm for SATA.
+ 		 * 0: 60ohm, 8: 50ohm 15: 44ohm (by step abort 1ohm)
+ 		 */
+-		val = PHYREG7_TX_RTERM_50OHM << PHYREG7_TX_RTERM_SHIFT;
+-		val |= PHYREG7_RX_RTERM_44OHM << PHYREG7_RX_RTERM_SHIFT;
+-		writel(val, priv->mmio + PHYREG7);
++		val = RK3568_PHYREG7_TX_RTERM_50OHM << RK3568_PHYREG7_TX_RTERM_SHIFT;
++		val |= RK3568_PHYREG7_RX_RTERM_44OHM << RK3568_PHYREG7_RX_RTERM_SHIFT;
++		writel(val, priv->mmio + RK3568_PHYREG7);
+ 
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->con0_for_sata, true);
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->con1_for_sata, true);
+@@ -959,11 +969,11 @@ static int rk3588_combphy_cfg(struct roc
+ 	case REF_CLOCK_24MHz:
+ 		if (priv->type == PHY_TYPE_USB3 || priv->type == PHY_TYPE_SATA) {
+ 			/* Set ssc_cnt[9:0]=0101111101 & 31.5KHz. */
+-			val = PHYREG15_SSC_CNT_VALUE << PHYREG15_SSC_CNT_SHIFT;
+-			rockchip_combphy_updatel(priv, PHYREG15_SSC_CNT_MASK,
+-						 val, PHYREG15);
++			val = RK3568_PHYREG15_SSC_CNT_VALUE << RK3568_PHYREG15_SSC_CNT_SHIFT;
++			rockchip_combphy_updatel(priv, RK3568_PHYREG15_SSC_CNT_MASK,
++						 val, RK3568_PHYREG15);
+ 
+-			writel(PHYREG16_SSC_CNT_VALUE, priv->mmio + PHYREG16);
++			writel(RK3568_PHYREG16_SSC_CNT_VALUE, priv->mmio + RK3568_PHYREG16);
+ 		}
+ 		break;
+ 
+@@ -974,23 +984,25 @@ static int rk3588_combphy_cfg(struct roc
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_100m, true);
+ 		if (priv->type == PHY_TYPE_PCIE) {
+ 			/* PLL KVCO fine tuning. */
+-			val = 4 << PHYREG33_PLL_KVCO_SHIFT;
+-			rockchip_combphy_updatel(priv, PHYREG33_PLL_KVCO_MASK,
+-						 val, PHYREG33);
++			val = 4 << RK3568_PHYREG33_PLL_KVCO_SHIFT;
++			rockchip_combphy_updatel(priv, RK3568_PHYREG33_PLL_KVCO_MASK,
++						 val, RK3568_PHYREG33);
+ 
+ 			/* Enable controlling random jitter. */
+-			writel(PHYREG12_PLL_LPF_ADJ_VALUE, priv->mmio + PHYREG12);
++			writel(RK3568_PHYREG12_PLL_LPF_ADJ_VALUE, priv->mmio + RK3568_PHYREG12);
+ 
+ 			/* Set up rx_trim: PLL LPF C1 85pf R1 1.25kohm */
+-			writel(PHYREG27_RX_TRIM_RK3588, priv->mmio + PHYREG27);
++			writel(RK3588_PHYREG27_RX_TRIM, priv->mmio + RK3588_PHYREG27);
+ 
+ 			/* Set up su_trim:  */
+-			writel(PHYREG11_SU_TRIM_0_7, priv->mmio + PHYREG11);
++			writel(RK3568_PHYREG11_SU_TRIM_0_7, priv->mmio + RK3568_PHYREG11);
+ 		} else if (priv->type == PHY_TYPE_SATA) {
+ 			/* downward spread spectrum +500ppm */
+-			val = PHYREG32_SSC_DOWNWARD << PHYREG32_SSC_DIR_SHIFT;
+-			val |= PHYREG32_SSC_OFFSET_500PPM << PHYREG32_SSC_OFFSET_SHIFT;
+-			rockchip_combphy_updatel(priv, PHYREG32_SSC_MASK, val, PHYREG32);
++			val = RK3568_PHYREG32_SSC_DOWNWARD << RK3568_PHYREG32_SSC_DIR_SHIFT;
++			val |= RK3568_PHYREG32_SSC_OFFSET_500PPM <<
++			       RK3568_PHYREG32_SSC_OFFSET_SHIFT;
++			rockchip_combphy_updatel(priv, RK3568_PHYREG32_SSC_MASK, val,
++						 RK3568_PHYREG32);
+ 		}
+ 		break;
+ 	default:
+@@ -1001,20 +1013,21 @@ static int rk3588_combphy_cfg(struct roc
+ 	if (priv->ext_refclk) {
+ 		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_ext, true);
+ 		if (priv->type == PHY_TYPE_PCIE && rate == REF_CLOCK_100MHz) {
+-			val = PHYREG13_RESISTER_HIGH_Z << PHYREG13_RESISTER_SHIFT;
+-			val |= PHYREG13_CKRCV_AMP0;
+-			rockchip_combphy_updatel(priv, PHYREG13_RESISTER_MASK, val, PHYREG13);
+-
+-			val = readl(priv->mmio + PHYREG14);
+-			val |= PHYREG14_CKRCV_AMP1;
+-			writel(val, priv->mmio + PHYREG14);
++			val = RK3568_PHYREG13_RESISTER_HIGH_Z << RK3568_PHYREG13_RESISTER_SHIFT;
++			val |= RK3568_PHYREG13_CKRCV_AMP0;
++			rockchip_combphy_updatel(priv, RK3568_PHYREG13_RESISTER_MASK, val,
++						 RK3568_PHYREG13);
++
++			val = readl(priv->mmio + RK3568_PHYREG14);
++			val |= RK3568_PHYREG14_CKRCV_AMP1;
++			writel(val, priv->mmio + RK3568_PHYREG14);
+ 		}
+ 	}
+ 
+ 	if (priv->enable_ssc) {
+-		val = readl(priv->mmio + PHYREG8);
+-		val |= PHYREG8_SSC_EN;
+-		writel(val, priv->mmio + PHYREG8);
++		val = readl(priv->mmio + RK3568_PHYREG8);
++		val |= RK3568_PHYREG8_SSC_EN;
++		writel(val, priv->mmio + RK3568_PHYREG8);
+ 	}
+ 
+ 	return 0;
diff --git a/target/linux/rockchip/patches-6.12/036-08-v6.18-phy-rockchip-naneng-combphy-Add-RK3528-support.patch b/target/linux/rockchip/patches-6.12/036-08-v6.18-phy-rockchip-naneng-combphy-Add-RK3528-support.patch
new file mode 100644
index 0000000000..c95e0ba932
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/036-08-v6.18-phy-rockchip-naneng-combphy-Add-RK3528-support.patch
@@ -0,0 +1,231 @@
+From aee07ee1b97d9a3825e8db609a1c76157218cc59 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Mon, 28 Jul 2025 10:29:47 +0000
+Subject: [PATCH] phy: rockchip: naneng-combphy: Add RK3528 support
+
+Rockchip RK3528 integrates one naneng-combphy that is able to operate in
+PCIe and USB3 mode. The control logic is similar to previous variants of
+naneng-combphy but the register layout is apparently different from the
+RK3568 one.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Reviewed-by: Heiko Stuebner <heiko at sntech.de>
+Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>
+Link: https://lore.kernel.org/r/20250728102947.38984-7-ziyao@disroot.org
+Signed-off-by: Vinod Koul <vkoul at kernel.org>
+---
+ .../rockchip/phy-rockchip-naneng-combphy.c    | 189 +++++++++++++++++-
+ 1 file changed, 188 insertions(+), 1 deletion(-)
+
+--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
++++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
+@@ -20,7 +20,46 @@
+ #define REF_CLOCK_25MHz			(25 * HZ_PER_MHZ)
+ #define REF_CLOCK_100MHz		(100 * HZ_PER_MHZ)
+ 
+-/* COMBO PHY REG */
++/* RK3528 COMBO PHY REG */
++#define RK3528_PHYREG6				0x18
++#define RK3528_PHYREG6_PLL_KVCO			GENMASK(12, 10)
++#define RK3528_PHYREG6_PLL_KVCO_VALUE		0x2
++#define RK3528_PHYREG6_SSC_DIR			GENMASK(5, 4)
++#define RK3528_PHYREG6_SSC_UPWARD		0
++#define RK3528_PHYREG6_SSC_DOWNWARD		1
++
++#define RK3528_PHYREG40				0x100
++#define RK3528_PHYREG40_SSC_EN			BIT(20)
++#define RK3528_PHYREG40_SSC_CNT			GENMASK(10, 0)
++#define RK3528_PHYREG40_SSC_CNT_VALUE		0x17d
++
++#define RK3528_PHYREG42				0x108
++#define RK3528_PHYREG42_CKDRV_CLK_SEL		BIT(29)
++#define RK3528_PHYREG42_CKDRV_CLK_PLL		0
++#define RK3528_PHYREG42_CKDRV_CLK_CKRCV		1
++#define RK3528_PHYREG42_PLL_LPF_R1_ADJ		GENMASK(10, 7)
++#define RK3528_PHYREG42_PLL_LPF_R1_ADJ_VALUE	0x9
++#define RK3528_PHYREG42_PLL_CHGPUMP_CUR_ADJ	GENMASK(6, 4)
++#define RK3528_PHYREG42_PLL_CHGPUMP_CUR_ADJ_VALUE 0x7
++#define RK3528_PHYREG42_PLL_KVCO_ADJ		GENMASK(2, 0)
++#define RK3528_PHYREG42_PLL_KVCO_ADJ_VALUE	0x0
++
++#define RK3528_PHYREG80				0x200
++#define RK3528_PHYREG80_CTLE_EN			BIT(17)
++
++#define RK3528_PHYREG81				0x204
++#define RK3528_PHYREG81_CDR_PHASE_PATH_GAIN_2X	BIT(5)
++#define RK3528_PHYREG81_SLEW_RATE_CTRL		GENMASK(2, 0)
++#define RK3528_PHYREG81_SLEW_RATE_CTRL_SLOW	0x7
++
++#define RK3528_PHYREG83				0x20c
++#define RK3528_PHYREG83_RX_SQUELCH		GENMASK(2, 0)
++#define RK3528_PHYREG83_RX_SQUELCH_VALUE	0x6
++
++#define RK3528_PHYREG86				0x218
++#define RK3528_PHYREG86_RTERM_DET_CLK_EN	BIT(14)
++
++/* RK3568 COMBO PHY REG */
+ #define RK3568_PHYREG6				0x14
+ #define RK3568_PHYREG6_PLL_DIV_MASK		GENMASK(7, 6)
+ #define RK3568_PHYREG6_PLL_DIV_SHIFT		6
+@@ -400,6 +439,150 @@ static int rockchip_combphy_probe(struct
+ 	return PTR_ERR_OR_ZERO(phy_provider);
+ }
+ 
++static int rk3528_combphy_cfg(struct rockchip_combphy_priv *priv)
++{
++	const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
++	unsigned long rate;
++	u32 val;
++
++	/* Set SSC downward spread spectrum */
++	val = FIELD_PREP(RK3528_PHYREG6_SSC_DIR, RK3528_PHYREG6_SSC_DOWNWARD);
++	rockchip_combphy_updatel(priv, RK3528_PHYREG6_SSC_DIR, val, RK3528_PHYREG6);
++
++	switch (priv->type) {
++	case PHY_TYPE_PCIE:
++		rockchip_combphy_param_write(priv->phy_grf, &cfg->con0_for_pcie, true);
++		rockchip_combphy_param_write(priv->phy_grf, &cfg->con1_for_pcie, true);
++		rockchip_combphy_param_write(priv->phy_grf, &cfg->con2_for_pcie, true);
++		rockchip_combphy_param_write(priv->phy_grf, &cfg->con3_for_pcie, true);
++		break;
++	case PHY_TYPE_USB3:
++		/* Enable adaptive CTLE for USB3.0 Rx */
++		rockchip_combphy_updatel(priv, RK3528_PHYREG80_CTLE_EN, RK3528_PHYREG80_CTLE_EN,
++					 RK3528_PHYREG80);
++
++		/* Set slow slew rate control for PI */
++		val = FIELD_PREP(RK3528_PHYREG81_SLEW_RATE_CTRL,
++				 RK3528_PHYREG81_SLEW_RATE_CTRL_SLOW);
++		rockchip_combphy_updatel(priv, RK3528_PHYREG81_SLEW_RATE_CTRL, val,
++					 RK3528_PHYREG81);
++
++		/* Set CDR phase path with 2x gain */
++		rockchip_combphy_updatel(priv, RK3528_PHYREG81_CDR_PHASE_PATH_GAIN_2X,
++					 RK3528_PHYREG81_CDR_PHASE_PATH_GAIN_2X, RK3528_PHYREG81);
++
++		/* Set Rx squelch input filler bandwidth */
++		val = FIELD_PREP(RK3528_PHYREG83_RX_SQUELCH, RK3528_PHYREG83_RX_SQUELCH_VALUE);
++		rockchip_combphy_updatel(priv, RK3528_PHYREG83_RX_SQUELCH, val, RK3528_PHYREG83);
++
++		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
++		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false);
++		rockchip_combphy_param_write(priv->phy_grf, &cfg->usb_mode_set, true);
++		rockchip_combphy_param_write(priv->pipe_grf, &cfg->u3otg0_port_en, true);
++		break;
++	default:
++		dev_err(priv->dev, "incompatible PHY type\n");
++		return -EINVAL;
++	}
++
++	rate = clk_get_rate(priv->refclk);
++
++	switch (rate) {
++	case REF_CLOCK_24MHz:
++		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_24m, true);
++		if (priv->type == PHY_TYPE_USB3) {
++			/* Set ssc_cnt[10:0]=00101111101 & 31.5KHz */
++			val = FIELD_PREP(RK3528_PHYREG40_SSC_CNT, RK3528_PHYREG40_SSC_CNT_VALUE);
++			rockchip_combphy_updatel(priv, RK3528_PHYREG40_SSC_CNT, val,
++						 RK3528_PHYREG40);
++		} else if (priv->type == PHY_TYPE_PCIE) {
++			/* tx_trim[14]=1, Enable the counting clock of the rterm detect */
++			rockchip_combphy_updatel(priv, RK3528_PHYREG86_RTERM_DET_CLK_EN,
++						 RK3528_PHYREG86_RTERM_DET_CLK_EN, RK3528_PHYREG86);
++		}
++		break;
++	case REF_CLOCK_100MHz:
++		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_100m, true);
++		if (priv->type == PHY_TYPE_PCIE) {
++			/* PLL KVCO tuning fine */
++			val = FIELD_PREP(RK3528_PHYREG6_PLL_KVCO, RK3528_PHYREG6_PLL_KVCO_VALUE);
++			rockchip_combphy_updatel(priv, RK3528_PHYREG6_PLL_KVCO, val,
++						 RK3528_PHYREG6);
++
++			/* su_trim[6:4]=111, [10:7]=1001, [2:0]=000, swing 650mv */
++			writel(0x570804f0, priv->mmio + RK3528_PHYREG42);
++		}
++		break;
++	default:
++		dev_err(priv->dev, "Unsupported rate: %lu\n", rate);
++		return -EINVAL;
++	}
++
++	if (device_property_read_bool(priv->dev, "rockchip,ext-refclk")) {
++		rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_ext, true);
++
++		if (priv->type == PHY_TYPE_PCIE && rate == REF_CLOCK_100MHz) {
++			val = FIELD_PREP(RK3528_PHYREG42_CKDRV_CLK_SEL,
++					 RK3528_PHYREG42_CKDRV_CLK_CKRCV);
++			val |= FIELD_PREP(RK3528_PHYREG42_PLL_LPF_R1_ADJ,
++					  RK3528_PHYREG42_PLL_LPF_R1_ADJ_VALUE);
++			val |= FIELD_PREP(RK3528_PHYREG42_PLL_CHGPUMP_CUR_ADJ,
++					  RK3528_PHYREG42_PLL_CHGPUMP_CUR_ADJ_VALUE);
++			val |= FIELD_PREP(RK3528_PHYREG42_PLL_KVCO_ADJ,
++					  RK3528_PHYREG42_PLL_KVCO_ADJ_VALUE);
++			rockchip_combphy_updatel(priv,
++						 RK3528_PHYREG42_CKDRV_CLK_SEL		|
++						 RK3528_PHYREG42_PLL_LPF_R1_ADJ		|
++						 RK3528_PHYREG42_PLL_CHGPUMP_CUR_ADJ	|
++						 RK3528_PHYREG42_PLL_KVCO_ADJ,
++						 val, RK3528_PHYREG42);
++
++			val = FIELD_PREP(RK3528_PHYREG6_PLL_KVCO, RK3528_PHYREG6_PLL_KVCO_VALUE);
++			rockchip_combphy_updatel(priv, RK3528_PHYREG6_PLL_KVCO, val,
++						 RK3528_PHYREG6);
++		}
++	}
++
++	if (priv->type == PHY_TYPE_PCIE) {
++		if (device_property_read_bool(priv->dev, "rockchip,enable-ssc"))
++			rockchip_combphy_updatel(priv, RK3528_PHYREG40_SSC_EN,
++						 RK3528_PHYREG40_SSC_EN, RK3528_PHYREG40);
++	}
++
++	return 0;
++}
++
++static const struct rockchip_combphy_grfcfg rk3528_combphy_grfcfgs = {
++	/* pipe-phy-grf */
++	.pcie_mode_set		= { 0x0000, 5, 0, 0x00, 0x11 },
++	.usb_mode_set		= { 0x0000, 5, 0, 0x00, 0x04 },
++	.pipe_rxterm_set	= { 0x0000, 12, 12, 0x00, 0x01 },
++	.pipe_txelec_set	= { 0x0004, 1, 1, 0x00, 0x01 },
++	.pipe_txcomp_set	= { 0x0004, 4, 4, 0x00, 0x01 },
++	.pipe_clk_24m		= { 0x0004, 14, 13, 0x00, 0x00 },
++	.pipe_clk_100m		= { 0x0004, 14, 13, 0x00, 0x02 },
++	.pipe_rxterm_sel	= { 0x0008, 8, 8, 0x00, 0x01 },
++	.pipe_txelec_sel	= { 0x0008, 12, 12, 0x00, 0x01 },
++	.pipe_txcomp_sel	= { 0x0008, 15, 15, 0x00, 0x01 },
++	.pipe_clk_ext		= { 0x000c, 9, 8, 0x02, 0x01 },
++	.pipe_phy_status	= { 0x0034, 6, 6, 0x01, 0x00 },
++	.con0_for_pcie		= { 0x0000, 15, 0, 0x00, 0x110 },
++	.con1_for_pcie		= { 0x0004, 15, 0, 0x00, 0x00 },
++	.con2_for_pcie		= { 0x0008, 15, 0, 0x00, 0x101 },
++	.con3_for_pcie		= { 0x000c, 15, 0, 0x00, 0x0200 },
++	/* pipe-grf */
++	.u3otg0_port_en         = { 0x0044, 15, 0, 0x0181, 0x1100 },
++};
++
++static const struct rockchip_combphy_cfg rk3528_combphy_cfgs = {
++	.num_phys	= 1,
++	.phy_ids	= {
++		0xffdc0000,
++	},
++	.grfcfg		= &rk3528_combphy_grfcfgs,
++	.combphy_cfg	= rk3528_combphy_cfg,
++};
++
+ static int rk3568_combphy_cfg(struct rockchip_combphy_priv *priv)
+ {
+ 	const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
+@@ -1075,6 +1258,10 @@ static const struct rockchip_combphy_cfg
+ 
+ static const struct of_device_id rockchip_combphy_of_match[] = {
+ 	{
++		.compatible = "rockchip,rk3528-naneng-combphy",
++		.data = &rk3528_combphy_cfgs,
++	},
++	{
+ 		.compatible = "rockchip,rk3568-naneng-combphy",
+ 		.data = &rk3568_combphy_cfgs,
+ 	},
diff --git a/target/linux/rockchip/patches-6.12/038-v6.15-iio-adc-rockchip_saradc-Add-support-for-RK3528.patch b/target/linux/rockchip/patches-6.12/038-v6.15-iio-adc-rockchip_saradc-Add-support-for-RK3528.patch
new file mode 100644
index 0000000000..0273ea2616
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/038-v6.15-iio-adc-rockchip_saradc-Add-support-for-RK3528.patch
@@ -0,0 +1,57 @@
+From 8a9aa0bbd615c9b377bd82e671519f0c4cb272dd Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Thu, 27 Feb 2025 18:40:51 +0000
+Subject: [PATCH] iio: adc: rockchip_saradc: Add support for RK3528
+
+The Successive Approximation ADC (SARADC) in RK3528 uses the v2
+controller and support:
+- 10-bit resolution
+- Up to 1MS/s sampling rate
+- 4 single-ended input channels
+- Current consumption: 0.5mA @ 1MS/s
+
+Add support for the 4 channels of 10-bit resolution supported by SARADC
+in RK3528.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Reviewed-by: Heiko Stuebner <heiko at sntech.de>
+Link: https://patch.msgid.link/20250227184058.2964204-3-jonas@kwiboo.se
+Signed-off-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>
+---
+ drivers/iio/adc/rockchip_saradc.c | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+--- a/drivers/iio/adc/rockchip_saradc.c
++++ b/drivers/iio/adc/rockchip_saradc.c
+@@ -275,6 +275,21 @@ static const struct rockchip_saradc_data
+ 	.power_down = rockchip_saradc_power_down_v1,
+ };
+ 
++static const struct iio_chan_spec rockchip_rk3528_saradc_iio_channels[] = {
++	SARADC_CHANNEL(0, "adc0", 10),
++	SARADC_CHANNEL(1, "adc1", 10),
++	SARADC_CHANNEL(2, "adc2", 10),
++	SARADC_CHANNEL(3, "adc3", 10),
++};
++
++static const struct rockchip_saradc_data rk3528_saradc_data = {
++	.channels = rockchip_rk3528_saradc_iio_channels,
++	.num_channels = ARRAY_SIZE(rockchip_rk3528_saradc_iio_channels),
++	.clk_rate = 1000000,
++	.start = rockchip_saradc_start_v2,
++	.read = rockchip_saradc_read_v2,
++};
++
+ static const struct iio_chan_spec rockchip_rk3568_saradc_iio_channels[] = {
+ 	SARADC_CHANNEL(0, "adc0", 10),
+ 	SARADC_CHANNEL(1, "adc1", 10),
+@@ -325,6 +340,9 @@ static const struct of_device_id rockchi
+ 		.compatible = "rockchip,rk3399-saradc",
+ 		.data = &rk3399_saradc_data,
+ 	}, {
++		.compatible = "rockchip,rk3528-saradc",
++		.data = &rk3528_saradc_data,
++	}, {
+ 		.compatible = "rockchip,rk3568-saradc",
+ 		.data = &rk3568_saradc_data,
+ 	}, {
diff --git a/target/linux/rockchip/patches-6.12/039-01-v6.15-net-stmmac-dwmac-rk-Add-GMAC-support-for-RK3528.patch b/target/linux/rockchip/patches-6.12/039-01-v6.15-net-stmmac-dwmac-rk-Add-GMAC-support-for-RK3528.patch
new file mode 100644
index 0000000000..cc810b38b0
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/039-01-v6.15-net-stmmac-dwmac-rk-Add-GMAC-support-for-RK3528.patch
@@ -0,0 +1,166 @@
+From 1725f0eb37d621ce48303ccc14748fb66d618c9e Mon Sep 17 00:00:00 2001
+From: David Wu <david.wu at rock-chips.com>
+Date: Wed, 19 Mar 2025 21:44:06 +0000
+Subject: [PATCH] net: stmmac: dwmac-rk: Add GMAC support for RK3528
+
+Rockchip RK3528 has two Ethernet controllers based on Synopsys DWC
+Ethernet QoS IP.
+
+Add initial support for the RK3528 GMAC variant.
+
+Signed-off-by: David Wu <david.wu at rock-chips.com>
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://patch.msgid.link/20250319214415.3086027-3-jonas@kwiboo.se
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ .../net/ethernet/stmicro/stmmac/dwmac-rk.c    | 132 ++++++++++++++++++
+ 1 file changed, 132 insertions(+)
+
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+@@ -1014,6 +1014,137 @@ static const struct rk_gmac_ops rk3399_o
+ 	.set_rmii_speed = rk3399_set_rmii_speed,
+ };
+ 
++#define RK3528_VO_GRF_GMAC_CON		0x0018
++#define RK3528_VO_GRF_MACPHY_CON0	0x001c
++#define RK3528_VO_GRF_MACPHY_CON1	0x0020
++#define RK3528_VPU_GRF_GMAC_CON5	0x0018
++#define RK3528_VPU_GRF_GMAC_CON6	0x001c
++
++#define RK3528_GMAC_RXCLK_DLY_ENABLE	GRF_BIT(15)
++#define RK3528_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(15)
++#define RK3528_GMAC_TXCLK_DLY_ENABLE	GRF_BIT(14)
++#define RK3528_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(14)
++
++#define RK3528_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0xFF, 8)
++#define RK3528_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0xFF, 0)
++
++#define RK3528_GMAC0_PHY_INTF_SEL_RMII	GRF_BIT(1)
++#define RK3528_GMAC1_PHY_INTF_SEL_RGMII	GRF_CLR_BIT(8)
++#define RK3528_GMAC1_PHY_INTF_SEL_RMII	GRF_BIT(8)
++
++#define RK3528_GMAC1_CLK_SELECT_CRU	GRF_CLR_BIT(12)
++#define RK3528_GMAC1_CLK_SELECT_IO	GRF_BIT(12)
++
++#define RK3528_GMAC0_CLK_RMII_DIV2	GRF_BIT(3)
++#define RK3528_GMAC0_CLK_RMII_DIV20	GRF_CLR_BIT(3)
++#define RK3528_GMAC1_CLK_RMII_DIV2	GRF_BIT(10)
++#define RK3528_GMAC1_CLK_RMII_DIV20	GRF_CLR_BIT(10)
++
++#define RK3528_GMAC1_CLK_RGMII_DIV1	(GRF_CLR_BIT(11) | GRF_CLR_BIT(10))
++#define RK3528_GMAC1_CLK_RGMII_DIV5	(GRF_BIT(11) | GRF_BIT(10))
++#define RK3528_GMAC1_CLK_RGMII_DIV50	(GRF_BIT(11) | GRF_CLR_BIT(10))
++
++#define RK3528_GMAC0_CLK_RMII_GATE	GRF_BIT(2)
++#define RK3528_GMAC0_CLK_RMII_NOGATE	GRF_CLR_BIT(2)
++#define RK3528_GMAC1_CLK_RMII_GATE	GRF_BIT(9)
++#define RK3528_GMAC1_CLK_RMII_NOGATE	GRF_CLR_BIT(9)
++
++static void rk3528_set_to_rgmii(struct rk_priv_data *bsp_priv,
++				int tx_delay, int rx_delay)
++{
++	regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5,
++		     RK3528_GMAC1_PHY_INTF_SEL_RGMII);
++
++	regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5,
++		     DELAY_ENABLE(RK3528, tx_delay, rx_delay));
++
++	regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON6,
++		     RK3528_GMAC_CLK_RX_DL_CFG(rx_delay) |
++		     RK3528_GMAC_CLK_TX_DL_CFG(tx_delay));
++}
++
++static void rk3528_set_to_rmii(struct rk_priv_data *bsp_priv)
++{
++	if (bsp_priv->id == 1)
++		regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5,
++			     RK3528_GMAC1_PHY_INTF_SEL_RMII);
++	else
++		regmap_write(bsp_priv->grf, RK3528_VO_GRF_GMAC_CON,
++			     RK3528_GMAC0_PHY_INTF_SEL_RMII |
++			     RK3528_GMAC0_CLK_RMII_DIV2);
++}
++
++static void rk3528_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
++{
++	struct device *dev = &bsp_priv->pdev->dev;
++
++	if (speed == 10)
++		regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5,
++			     RK3528_GMAC1_CLK_RGMII_DIV50);
++	else if (speed == 100)
++		regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5,
++			     RK3528_GMAC1_CLK_RGMII_DIV5);
++	else if (speed == 1000)
++		regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5,
++			     RK3528_GMAC1_CLK_RGMII_DIV1);
++	else
++		dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
++}
++
++static void rk3528_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
++{
++	struct device *dev = &bsp_priv->pdev->dev;
++	unsigned int reg, val;
++
++	if (speed == 10)
++		val = bsp_priv->id == 1 ? RK3528_GMAC1_CLK_RMII_DIV20 :
++					  RK3528_GMAC0_CLK_RMII_DIV20;
++	else if (speed == 100)
++		val = bsp_priv->id == 1 ? RK3528_GMAC1_CLK_RMII_DIV2 :
++					  RK3528_GMAC0_CLK_RMII_DIV2;
++	else {
++		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
++		return;
++	}
++
++	reg = bsp_priv->id == 1 ? RK3528_VPU_GRF_GMAC_CON5 :
++				  RK3528_VO_GRF_GMAC_CON;
++
++	regmap_write(bsp_priv->grf, reg, val);
++}
++
++static void rk3528_set_clock_selection(struct rk_priv_data *bsp_priv,
++				       bool input, bool enable)
++{
++	unsigned int val;
++
++	if (bsp_priv->id == 1) {
++		val = input ? RK3528_GMAC1_CLK_SELECT_IO :
++			      RK3528_GMAC1_CLK_SELECT_CRU;
++		val |= enable ? RK3528_GMAC1_CLK_RMII_NOGATE :
++				RK3528_GMAC1_CLK_RMII_GATE;
++		regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, val);
++	} else {
++		val = enable ? RK3528_GMAC0_CLK_RMII_NOGATE :
++			       RK3528_GMAC0_CLK_RMII_GATE;
++		regmap_write(bsp_priv->grf, RK3528_VO_GRF_GMAC_CON, val);
++	}
++}
++
++static const struct rk_gmac_ops rk3528_ops = {
++	.set_to_rgmii = rk3528_set_to_rgmii,
++	.set_to_rmii = rk3528_set_to_rmii,
++	.set_rgmii_speed = rk3528_set_rgmii_speed,
++	.set_rmii_speed = rk3528_set_rmii_speed,
++	.set_clock_selection = rk3528_set_clock_selection,
++	.regs_valid = true,
++	.regs = {
++		0xffbd0000, /* gmac0 */
++		0xffbe0000, /* gmac1 */
++		0x0, /* sentinel */
++	},
++};
++
+ #define RK3568_GRF_GMAC0_CON0		0x0380
+ #define RK3568_GRF_GMAC0_CON1		0x0384
+ #define RK3568_GRF_GMAC1_CON0		0x0388
+@@ -2080,6 +2211,7 @@ static const struct of_device_id rk_gmac
+ 	{ .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops },
+ 	{ .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
+ 	{ .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
++	{ .compatible = "rockchip,rk3528-gmac", .data = &rk3528_ops },
+ 	{ .compatible = "rockchip,rk3568-gmac", .data = &rk3568_ops },
+ 	{ .compatible = "rockchip,rk3576-gmac", .data = &rk3576_ops },
+ 	{ .compatible = "rockchip,rk3588-gmac", .data = &rk3588_ops },
diff --git a/target/linux/rockchip/patches-6.12/039-02-v6.15-net-stmmac-dwmac-rk-Move-integrated_phy_powerup-down.patch b/target/linux/rockchip/patches-6.12/039-02-v6.15-net-stmmac-dwmac-rk-Move-integrated_phy_powerup-down.patch
new file mode 100644
index 0000000000..ad7182ffb7
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/039-02-v6.15-net-stmmac-dwmac-rk-Move-integrated_phy_powerup-down.patch
@@ -0,0 +1,126 @@
+From 0bed91f2b183bc38c216299ce035b44210148785 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Wed, 19 Mar 2025 21:44:07 +0000
+Subject: [PATCH] net: stmmac: dwmac-rk: Move integrated_phy_powerup/down
+ functions
+
+Rockchip RK3528 (and RV1106) has a different integrated PHY compared to
+the integrated PHY on RK3228/RK3328. Current powerup/down operation is
+not compatible with the integrated PHY found in these SoCs.
+
+Move the rk_gmac_integrated_phy_powerup/down functions to top of the
+file to prepare for them to be called directly by a GMAC variant
+specific powerup/down operation.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Reviewed-by: Andrew Lunn <andrew at lunn.ch>
+Link: https://patch.msgid.link/20250319214415.3086027-4-jonas@kwiboo.se
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ .../net/ethernet/stmicro/stmmac/dwmac-rk.c    | 88 +++++++++----------
+ 1 file changed, 44 insertions(+), 44 deletions(-)
+
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+@@ -92,6 +92,50 @@ struct rk_priv_data {
+ 	(((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
+ 	 ((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
+ 
++#define RK_GRF_MACPHY_CON0		0xb00
++#define RK_GRF_MACPHY_CON1		0xb04
++#define RK_GRF_MACPHY_CON2		0xb08
++#define RK_GRF_MACPHY_CON3		0xb0c
++
++#define RK_MACPHY_ENABLE		GRF_BIT(0)
++#define RK_MACPHY_DISABLE		GRF_CLR_BIT(0)
++#define RK_MACPHY_CFG_CLK_50M		GRF_BIT(14)
++#define RK_GMAC2PHY_RMII_MODE		(GRF_BIT(6) | GRF_CLR_BIT(7))
++#define RK_GRF_CON2_MACPHY_ID		HIWORD_UPDATE(0x1234, 0xffff, 0)
++#define RK_GRF_CON3_MACPHY_ID		HIWORD_UPDATE(0x35, 0x3f, 0)
++
++static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv)
++{
++	if (priv->ops->integrated_phy_powerup)
++		priv->ops->integrated_phy_powerup(priv);
++
++	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
++	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
++
++	regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID);
++	regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID);
++
++	if (priv->phy_reset) {
++		/* PHY needs to be disabled before trying to reset it */
++		regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
++		if (priv->phy_reset)
++			reset_control_assert(priv->phy_reset);
++		usleep_range(10, 20);
++		if (priv->phy_reset)
++			reset_control_deassert(priv->phy_reset);
++		usleep_range(10, 20);
++		regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE);
++		msleep(30);
++	}
++}
++
++static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv)
++{
++	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
++	if (priv->phy_reset)
++		reset_control_assert(priv->phy_reset);
++}
++
+ #define PX30_GRF_GMAC_CON1		0x0904
+ 
+ /* PX30_GRF_GMAC_CON1 */
+@@ -1730,50 +1774,6 @@ static const struct rk_gmac_ops rv1126_o
+ 	.set_rmii_speed = rv1126_set_rmii_speed,
+ };
+ 
+-#define RK_GRF_MACPHY_CON0		0xb00
+-#define RK_GRF_MACPHY_CON1		0xb04
+-#define RK_GRF_MACPHY_CON2		0xb08
+-#define RK_GRF_MACPHY_CON3		0xb0c
+-
+-#define RK_MACPHY_ENABLE		GRF_BIT(0)
+-#define RK_MACPHY_DISABLE		GRF_CLR_BIT(0)
+-#define RK_MACPHY_CFG_CLK_50M		GRF_BIT(14)
+-#define RK_GMAC2PHY_RMII_MODE		(GRF_BIT(6) | GRF_CLR_BIT(7))
+-#define RK_GRF_CON2_MACPHY_ID		HIWORD_UPDATE(0x1234, 0xffff, 0)
+-#define RK_GRF_CON3_MACPHY_ID		HIWORD_UPDATE(0x35, 0x3f, 0)
+-
+-static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv)
+-{
+-	if (priv->ops->integrated_phy_powerup)
+-		priv->ops->integrated_phy_powerup(priv);
+-
+-	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
+-	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
+-
+-	regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID);
+-	regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID);
+-
+-	if (priv->phy_reset) {
+-		/* PHY needs to be disabled before trying to reset it */
+-		regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
+-		if (priv->phy_reset)
+-			reset_control_assert(priv->phy_reset);
+-		usleep_range(10, 20);
+-		if (priv->phy_reset)
+-			reset_control_deassert(priv->phy_reset);
+-		usleep_range(10, 20);
+-		regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE);
+-		msleep(30);
+-	}
+-}
+-
+-static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv)
+-{
+-	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
+-	if (priv->phy_reset)
+-		reset_control_assert(priv->phy_reset);
+-}
+-
+ static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat)
+ {
+ 	struct rk_priv_data *bsp_priv = plat->bsp_priv;
diff --git a/target/linux/rockchip/patches-6.12/039-03-v6.15-net-stmmac-dwmac-rk-Add-integrated_phy_powerdown-operatio.patch b/target/linux/rockchip/patches-6.12/039-03-v6.15-net-stmmac-dwmac-rk-Add-integrated_phy_powerdown-operatio.patch
new file mode 100644
index 0000000000..ea45fb6625
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/039-03-v6.15-net-stmmac-dwmac-rk-Add-integrated_phy_powerdown-operatio.patch
@@ -0,0 +1,112 @@
+From 32c7bc0747bbd8ee4ee32026d36a24be56117d96 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Wed, 19 Mar 2025 21:44:08 +0000
+Subject: [PATCH] net: stmmac: dwmac-rk: Add integrated_phy_powerdown operation
+
+Rockchip RK3528 (and RV1106) has a different integrated PHY compared to
+the integrated PHY on RK3228/RK3328. Current powerup/down operation is
+not compatible with the integrated PHY found in these newer SoCs.
+
+Add a new integrated_phy_powerdown operation and change the call chain
+for integrated_phy_powerup to prepare support for the integrated PHY
+found in these newer SoCs.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Reviewed-by: Andrew Lunn <andrew at lunn.ch>
+Link: https://patch.msgid.link/20250319214415.3086027-5-jonas@kwiboo.se
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ .../net/ethernet/stmicro/stmmac/dwmac-rk.c    | 26 +++++++++++--------
+ 1 file changed, 15 insertions(+), 11 deletions(-)
+
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+@@ -33,6 +33,7 @@ struct rk_gmac_ops {
+ 	void (*set_clock_selection)(struct rk_priv_data *bsp_priv, bool input,
+ 				    bool enable);
+ 	void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
++	void (*integrated_phy_powerdown)(struct rk_priv_data *bsp_priv);
+ 	bool php_grf_required;
+ 	bool regs_valid;
+ 	u32 regs[];
+@@ -104,11 +105,8 @@ struct rk_priv_data {
+ #define RK_GRF_CON2_MACPHY_ID		HIWORD_UPDATE(0x1234, 0xffff, 0)
+ #define RK_GRF_CON3_MACPHY_ID		HIWORD_UPDATE(0x35, 0x3f, 0)
+ 
+-static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv)
++static void rk_gmac_integrated_ephy_powerup(struct rk_priv_data *priv)
+ {
+-	if (priv->ops->integrated_phy_powerup)
+-		priv->ops->integrated_phy_powerup(priv);
+-
+ 	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
+ 	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
+ 
+@@ -129,7 +127,7 @@ static void rk_gmac_integrated_phy_power
+ 	}
+ }
+ 
+-static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv)
++static void rk_gmac_integrated_ephy_powerdown(struct rk_priv_data *priv)
+ {
+ 	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
+ 	if (priv->phy_reset)
+@@ -423,6 +421,8 @@ static void rk3228_integrated_phy_poweru
+ {
+ 	regmap_write(priv->grf, RK3228_GRF_CON_MUX,
+ 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
++
++	rk_gmac_integrated_ephy_powerup(priv);
+ }
+ 
+ static const struct rk_gmac_ops rk3228_ops = {
+@@ -430,7 +430,8 @@ static const struct rk_gmac_ops rk3228_o
+ 	.set_to_rmii = rk3228_set_to_rmii,
+ 	.set_rgmii_speed = rk3228_set_rgmii_speed,
+ 	.set_rmii_speed = rk3228_set_rmii_speed,
+-	.integrated_phy_powerup =  rk3228_integrated_phy_powerup,
++	.integrated_phy_powerup = rk3228_integrated_phy_powerup,
++	.integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown,
+ };
+ 
+ #define RK3288_GRF_SOC_CON1	0x0248
+@@ -715,6 +716,8 @@ static void rk3328_integrated_phy_poweru
+ {
+ 	regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1,
+ 		     RK3328_MACPHY_RMII_MODE);
++
++	rk_gmac_integrated_ephy_powerup(priv);
+ }
+ 
+ static const struct rk_gmac_ops rk3328_ops = {
+@@ -722,7 +725,8 @@ static const struct rk_gmac_ops rk3328_o
+ 	.set_to_rmii = rk3328_set_to_rmii,
+ 	.set_rgmii_speed = rk3328_set_rgmii_speed,
+ 	.set_rmii_speed = rk3328_set_rmii_speed,
+-	.integrated_phy_powerup =  rk3328_integrated_phy_powerup,
++	.integrated_phy_powerup = rk3328_integrated_phy_powerup,
++	.integrated_phy_powerdown = rk_gmac_integrated_ephy_powerdown,
+ };
+ 
+ #define RK3366_GRF_SOC_CON6	0x0418
+@@ -2070,16 +2074,16 @@ static int rk_gmac_powerup(struct rk_pri
+ 
+ 	pm_runtime_get_sync(dev);
+ 
+-	if (bsp_priv->integrated_phy)
+-		rk_gmac_integrated_phy_powerup(bsp_priv);
++	if (bsp_priv->integrated_phy && bsp_priv->ops->integrated_phy_powerup)
++		bsp_priv->ops->integrated_phy_powerup(bsp_priv);
+ 
+ 	return 0;
+ }
+ 
+ static void rk_gmac_powerdown(struct rk_priv_data *gmac)
+ {
+-	if (gmac->integrated_phy)
+-		rk_gmac_integrated_phy_powerdown(gmac);
++	if (gmac->integrated_phy && gmac->ops->integrated_phy_powerdown)
++		gmac->ops->integrated_phy_powerdown(gmac);
+ 
+ 	pm_runtime_put_sync(&gmac->pdev->dev);
+ 
diff --git a/target/linux/rockchip/patches-6.12/039-04-v6.15-net-stmmac-dwmac-rk-Add-initial-support-for-RK3528.patch b/target/linux/rockchip/patches-6.12/039-04-v6.15-net-stmmac-dwmac-rk-Add-initial-support-for-RK3528.patch
new file mode 100644
index 0000000000..d5208ec01d
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/039-04-v6.15-net-stmmac-dwmac-rk-Add-initial-support-for-RK3528.patch
@@ -0,0 +1,84 @@
+From 83e7b35c7879497b51fd3fcd3a17b0b07f89e81b Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Wed, 19 Mar 2025 21:44:09 +0000
+Subject: [PATCH] net: stmmac: dwmac-rk: Add initial support for RK3528
+ integrated PHY
+
+Rockchip RK3528 (and RV1106) has a different integrated PHY compared to
+the integrated PHY on RK3228/RK3328. Current powerup/down operation is
+not compatible with the integrated PHY found in these newer SoCs.
+
+Add operations to powerup/down the integrated PHY found in RK3528.
+Use helpers that can be used by other GMAC variants in the future.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Reviewed-by: Andrew Lunn <andrew at lunn.ch>
+Link: https://patch.msgid.link/20250319214415.3086027-6-jonas@kwiboo.se
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ .../net/ethernet/stmicro/stmmac/dwmac-rk.c    | 41 +++++++++++++++++++
+ 1 file changed, 41 insertions(+)
+
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+@@ -134,6 +134,35 @@ static void rk_gmac_integrated_ephy_powe
+ 		reset_control_assert(priv->phy_reset);
+ }
+ 
++#define RK_FEPHY_SHUTDOWN		GRF_BIT(1)
++#define RK_FEPHY_POWERUP		GRF_CLR_BIT(1)
++#define RK_FEPHY_INTERNAL_RMII_SEL	GRF_BIT(6)
++#define RK_FEPHY_24M_CLK_SEL		(GRF_BIT(8) | GRF_BIT(9))
++#define RK_FEPHY_PHY_ID			GRF_BIT(11)
++
++static void rk_gmac_integrated_fephy_powerup(struct rk_priv_data *priv,
++					     unsigned int reg)
++{
++	reset_control_assert(priv->phy_reset);
++	usleep_range(20, 30);
++
++	regmap_write(priv->grf, reg,
++		     RK_FEPHY_POWERUP |
++		     RK_FEPHY_INTERNAL_RMII_SEL |
++		     RK_FEPHY_24M_CLK_SEL |
++		     RK_FEPHY_PHY_ID);
++	usleep_range(10000, 12000);
++
++	reset_control_deassert(priv->phy_reset);
++	usleep_range(50000, 60000);
++}
++
++static void rk_gmac_integrated_fephy_powerdown(struct rk_priv_data *priv,
++					       unsigned int reg)
++{
++	regmap_write(priv->grf, reg, RK_FEPHY_SHUTDOWN);
++}
++
+ #define PX30_GRF_GMAC_CON1		0x0904
+ 
+ /* PX30_GRF_GMAC_CON1 */
+@@ -1179,12 +1208,24 @@ static void rk3528_set_clock_selection(s
+ 	}
+ }
+ 
++static void rk3528_integrated_phy_powerup(struct rk_priv_data *bsp_priv)
++{
++	rk_gmac_integrated_fephy_powerup(bsp_priv, RK3528_VO_GRF_MACPHY_CON0);
++}
++
++static void rk3528_integrated_phy_powerdown(struct rk_priv_data *bsp_priv)
++{
++	rk_gmac_integrated_fephy_powerdown(bsp_priv, RK3528_VO_GRF_MACPHY_CON0);
++}
++
+ static const struct rk_gmac_ops rk3528_ops = {
+ 	.set_to_rgmii = rk3528_set_to_rgmii,
+ 	.set_to_rmii = rk3528_set_to_rmii,
+ 	.set_rgmii_speed = rk3528_set_rgmii_speed,
+ 	.set_rmii_speed = rk3528_set_rmii_speed,
+ 	.set_clock_selection = rk3528_set_clock_selection,
++	.integrated_phy_powerup = rk3528_integrated_phy_powerup,
++	.integrated_phy_powerdown = rk3528_integrated_phy_powerdown,
+ 	.regs_valid = true,
+ 	.regs = {
+ 		0xffbd0000, /* gmac0 */
diff --git a/target/linux/rockchip/patches-6.12/039-05-v6.15-net-stmmac-dwmac-rk-Remove-unneeded-GRF-and-peripheral-GR.patch b/target/linux/rockchip/patches-6.12/039-05-v6.15-net-stmmac-dwmac-rk-Remove-unneeded-GRF-and-peripheral-GR.patch
new file mode 100644
index 0000000000..c778d9ea40
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/039-05-v6.15-net-stmmac-dwmac-rk-Remove-unneeded-GRF-and-peripheral-GR.patch
@@ -0,0 +1,572 @@
+From 41f35564cb71e7043e0afcf30078b4a6145cab64 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Sat, 8 Mar 2025 21:37:15 +0000
+Subject: [PATCH] net: stmmac: dwmac-rk: Remove unneeded GRF and peripheral GRF
+ checks
+
+Now that GRF, and peripheral GRF where needed, is validated at probe
+time there is no longer any need to check and log an error in each SoC
+specific operation.
+
+Remove unneeded IS_ERR() checks and early bail out from each SoC
+specific operation.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Reviewed-by: Simon Horman <horms at kernel.org>
+Link: https://patch.msgid.link/20250308213720.2517944-4-jonas@kwiboo.se
+Reviewed-by: Sebastian Reichel <sebastian.reichel at collabora.com>
+Signed-off-by: Paolo Abeni <pabeni at redhat.com>
+---
+ .../net/ethernet/stmicro/stmmac/dwmac-rk.c    | 249 ------------------
+ 1 file changed, 249 deletions(-)
+
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+@@ -173,13 +173,6 @@ static void rk_gmac_integrated_fephy_pow
+ 
+ static void px30_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
+ 		     PX30_GMAC_PHY_INTF_SEL_RMII);
+ }
+@@ -253,13 +246,6 @@ static const struct rk_gmac_ops px30_ops
+ static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
+ 				int tx_delay, int rx_delay)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
+ 		     RK3128_GMAC_PHY_INTF_SEL_RGMII |
+ 		     RK3128_GMAC_RMII_MODE_CLR);
+@@ -271,13 +257,6 @@ static void rk3128_set_to_rgmii(struct r
+ 
+ static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
+ 		     RK3128_GMAC_PHY_INTF_SEL_RMII | RK3128_GMAC_RMII_MODE);
+ }
+@@ -286,11 +265,6 @@ static void rk3128_set_rgmii_speed(struc
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	if (speed == 10)
+ 		regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
+ 			     RK3128_GMAC_CLK_2_5M);
+@@ -308,11 +282,6 @@ static void rk3128_set_rmii_speed(struct
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	if (speed == 10) {
+ 		regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
+ 			     RK3128_GMAC_RMII_CLK_2_5M |
+@@ -369,13 +338,6 @@ static const struct rk_gmac_ops rk3128_o
+ static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
+ 				int tx_delay, int rx_delay)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
+ 		     RK3228_GMAC_PHY_INTF_SEL_RGMII |
+ 		     RK3228_GMAC_RMII_MODE_CLR |
+@@ -388,13 +350,6 @@ static void rk3228_set_to_rgmii(struct r
+ 
+ static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
+ 		     RK3228_GMAC_PHY_INTF_SEL_RMII |
+ 		     RK3228_GMAC_RMII_MODE);
+@@ -407,11 +362,6 @@ static void rk3228_set_rgmii_speed(struc
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	if (speed == 10)
+ 		regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
+ 			     RK3228_GMAC_CLK_2_5M);
+@@ -429,11 +379,6 @@ static void rk3228_set_rmii_speed(struct
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	if (speed == 10)
+ 		regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
+ 			     RK3228_GMAC_RMII_CLK_2_5M |
+@@ -494,13 +439,6 @@ static const struct rk_gmac_ops rk3228_o
+ static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
+ 				int tx_delay, int rx_delay)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
+ 		     RK3288_GMAC_PHY_INTF_SEL_RGMII |
+ 		     RK3288_GMAC_RMII_MODE_CLR);
+@@ -512,13 +450,6 @@ static void rk3288_set_to_rgmii(struct r
+ 
+ static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
+ 		     RK3288_GMAC_PHY_INTF_SEL_RMII | RK3288_GMAC_RMII_MODE);
+ }
+@@ -527,11 +458,6 @@ static void rk3288_set_rgmii_speed(struc
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	if (speed == 10)
+ 		regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
+ 			     RK3288_GMAC_CLK_2_5M);
+@@ -549,11 +475,6 @@ static void rk3288_set_rmii_speed(struct
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	if (speed == 10) {
+ 		regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
+ 			     RK3288_GMAC_RMII_CLK_2_5M |
+@@ -586,13 +507,6 @@ static const struct rk_gmac_ops rk3288_o
+ 
+ static void rk3308_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
+ 		     RK3308_GMAC_PHY_INTF_SEL_RMII);
+ }
+@@ -601,11 +515,6 @@ static void rk3308_set_rmii_speed(struct
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	if (speed == 10) {
+ 		regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
+ 			     RK3308_GMAC_SPEED_10M);
+@@ -658,13 +567,6 @@ static const struct rk_gmac_ops rk3308_o
+ static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
+ 				int tx_delay, int rx_delay)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
+ 		     RK3328_GMAC_PHY_INTF_SEL_RGMII |
+ 		     RK3328_GMAC_RMII_MODE_CLR |
+@@ -678,14 +580,8 @@ static void rk3328_set_to_rgmii(struct r
+ 
+ static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+ 	unsigned int reg;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
+ 		  RK3328_GRF_MAC_CON1;
+ 
+@@ -698,11 +594,6 @@ static void rk3328_set_rgmii_speed(struc
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	if (speed == 10)
+ 		regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
+ 			     RK3328_GMAC_CLK_2_5M);
+@@ -721,11 +612,6 @@ static void rk3328_set_rmii_speed(struct
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 	unsigned int reg;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
+ 		  RK3328_GRF_MAC_CON1;
+ 
+@@ -789,13 +675,6 @@ static const struct rk_gmac_ops rk3328_o
+ static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
+ 				int tx_delay, int rx_delay)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
+ 		     RK3366_GMAC_PHY_INTF_SEL_RGMII |
+ 		     RK3366_GMAC_RMII_MODE_CLR);
+@@ -807,13 +686,6 @@ static void rk3366_set_to_rgmii(struct r
+ 
+ static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
+ 		     RK3366_GMAC_PHY_INTF_SEL_RMII | RK3366_GMAC_RMII_MODE);
+ }
+@@ -822,11 +694,6 @@ static void rk3366_set_rgmii_speed(struc
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	if (speed == 10)
+ 		regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
+ 			     RK3366_GMAC_CLK_2_5M);
+@@ -844,11 +711,6 @@ static void rk3366_set_rmii_speed(struct
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	if (speed == 10) {
+ 		regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
+ 			     RK3366_GMAC_RMII_CLK_2_5M |
+@@ -900,13 +762,6 @@ static const struct rk_gmac_ops rk3366_o
+ static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
+ 				int tx_delay, int rx_delay)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
+ 		     RK3368_GMAC_PHY_INTF_SEL_RGMII |
+ 		     RK3368_GMAC_RMII_MODE_CLR);
+@@ -918,13 +773,6 @@ static void rk3368_set_to_rgmii(struct r
+ 
+ static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
+ 		     RK3368_GMAC_PHY_INTF_SEL_RMII | RK3368_GMAC_RMII_MODE);
+ }
+@@ -933,11 +781,6 @@ static void rk3368_set_rgmii_speed(struc
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	if (speed == 10)
+ 		regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
+ 			     RK3368_GMAC_CLK_2_5M);
+@@ -955,11 +798,6 @@ static void rk3368_set_rmii_speed(struct
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	if (speed == 10) {
+ 		regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
+ 			     RK3368_GMAC_RMII_CLK_2_5M |
+@@ -1011,13 +849,6 @@ static const struct rk_gmac_ops rk3368_o
+ static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
+ 				int tx_delay, int rx_delay)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
+ 		     RK3399_GMAC_PHY_INTF_SEL_RGMII |
+ 		     RK3399_GMAC_RMII_MODE_CLR);
+@@ -1029,13 +860,6 @@ static void rk3399_set_to_rgmii(struct r
+ 
+ static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
+ 		     RK3399_GMAC_PHY_INTF_SEL_RMII | RK3399_GMAC_RMII_MODE);
+ }
+@@ -1044,11 +868,6 @@ static void rk3399_set_rgmii_speed(struc
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	if (speed == 10)
+ 		regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
+ 			     RK3399_GMAC_CLK_2_5M);
+@@ -1066,11 +885,6 @@ static void rk3399_set_rmii_speed(struct
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	if (speed == 10) {
+ 		regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
+ 			     RK3399_GMAC_RMII_CLK_2_5M |
+@@ -1258,14 +1072,8 @@ static const struct rk_gmac_ops rk3528_o
+ static void rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv,
+ 				int tx_delay, int rx_delay)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+ 	u32 con0, con1;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	con0 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON0 :
+ 				     RK3568_GRF_GMAC0_CON0;
+ 	con1 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON1 :
+@@ -1283,14 +1091,8 @@ static void rk3568_set_to_rgmii(struct r
+ 
+ static void rk3568_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+ 	u32 con1;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	con1 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON1 :
+ 				     RK3568_GRF_GMAC0_CON1;
+ 	regmap_write(bsp_priv->grf, con1, RK3568_GMAC_PHY_INTF_SEL_RMII);
+@@ -1377,14 +1179,8 @@ static const struct rk_gmac_ops rk3568_o
+ static void rk3576_set_to_rgmii(struct rk_priv_data *bsp_priv,
+ 				int tx_delay, int rx_delay)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+ 	unsigned int offset_con;
+ 
+-	if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) {
+-		dev_err(dev, "Missing rockchip,grf or rockchip,php-grf property\n");
+-		return;
+-	}
+-
+ 	offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
+ 					 RK3576_GRF_GMAC_CON0;
+ 
+@@ -1410,14 +1206,8 @@ static void rk3576_set_to_rgmii(struct r
+ 
+ static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+ 	unsigned int offset_con;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
+ 					 RK3576_GRF_GMAC_CON0;
+ 
+@@ -1537,14 +1327,8 @@ static const struct rk_gmac_ops rk3576_o
+ static void rk3588_set_to_rgmii(struct rk_priv_data *bsp_priv,
+ 				int tx_delay, int rx_delay)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+ 	u32 offset_con, id = bsp_priv->id;
+ 
+-	if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) {
+-		dev_err(dev, "Missing rockchip,grf or rockchip,php_grf property\n");
+-		return;
+-	}
+-
+ 	offset_con = bsp_priv->id == 1 ? RK3588_GRF_GMAC_CON9 :
+ 					 RK3588_GRF_GMAC_CON8;
+ 
+@@ -1565,13 +1349,6 @@ static void rk3588_set_to_rgmii(struct r
+ 
+ static void rk3588_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->php_grf)) {
+-		dev_err(dev, "%s: Missing rockchip,php_grf property\n", __func__);
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0,
+ 		     RK3588_GMAC_PHY_INTF_SEL_RMII(bsp_priv->id));
+ 
+@@ -1655,13 +1432,6 @@ static const struct rk_gmac_ops rk3588_o
+ 
+ static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
+ 		     RV1108_GMAC_PHY_INTF_SEL_RMII);
+ }
+@@ -1670,11 +1440,6 @@ static void rv1108_set_rmii_speed(struct
+ {
+ 	struct device *dev = &bsp_priv->pdev->dev;
+ 
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	if (speed == 10) {
+ 		regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
+ 			     RV1108_GMAC_RMII_CLK_2_5M |
+@@ -1723,13 +1488,6 @@ static const struct rk_gmac_ops rv1108_o
+ static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv,
+ 				int tx_delay, int rx_delay)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "Missing rockchip,grf property\n");
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0,
+ 		     RV1126_GMAC_PHY_INTF_SEL_RGMII |
+ 		     RV1126_GMAC_M0_RXCLK_DLY_ENABLE |
+@@ -1748,13 +1506,6 @@ static void rv1126_set_to_rgmii(struct r
+ 
+ static void rv1126_set_to_rmii(struct rk_priv_data *bsp_priv)
+ {
+-	struct device *dev = &bsp_priv->pdev->dev;
+-
+-	if (IS_ERR(bsp_priv->grf)) {
+-		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+-		return;
+-	}
+-
+ 	regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0,
+ 		     RV1126_GMAC_PHY_INTF_SEL_RMII);
+ }




More information about the lede-commits mailing list