[openwrt/openwrt] rockchip: backport dts updates for rk3528
LEDE Commits
lede-commits at lists.infradead.org
Sat Nov 15 11:26:09 PST 2025
hauke pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/97b90c59513f36de1d88e87050f57d152f428742
commit 97b90c59513f36de1d88e87050f57d152f428742
Author: Tianling Shen <cnsztl at immortalwrt.org>
AuthorDate: Sat Oct 11 17:04:07 2025 +0800
rockchip: backport dts updates for rk3528
Backport core dts 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>
---
...4-dts-rockchip-Add-base-DT-for-rk3528-SoC.patch | 210 +++
...kchip-Add-clock-generators-for-RK3528-SoC.patch | 90 ++
...s-rockchip-Add-UART-clocks-for-RK3528-SoC.patch | 89 ++
...hip-Add-pinctrl-and-gpio-nodes-for-RK3528.patch | 1531 ++++++++++++++++++++
...dts-rockchip-Add-rk3528-QoS-register-node.patch | 185 +++
...s-rockchip-enable-SCMI-clk-for-RK3528-SoC.patch | 83 ++
...4-dts-rockchip-Add-SARADC-node-for-RK3528.patch | 43 +
...-rockchip-Add-SDHCI-controller-for-RK3528.patch | 50 +
...ip-Add-missing-uart3-interrupt-for-RK3528.patch | 30 +
...ts-rockchip-Add-DMA-controller-for-RK3528.patch | 41 +
...-rockchip-Add-UART-DMA-support-for-RK3528.patch | 81 ++
...s-rockchip-Add-I2C-controllers-for-RK3528.patch | 143 ++
...m64-dts-rockchip-Add-pwm-nodes-for-RK3528.patch | 105 ++
...hip-Add-SDMMC-SDIO-controllers-for-RK3528.patch | 103 ++
...64-dts-rockchip-Add-GMAC-nodes-for-RK3528.patch | 132 ++
...chip-move-rk3528-pinctrl-node-outside-the.patch | 171 +++
...m64-dts-rockchip-Add-spi-nodes-for-RK3528.patch | 51 +
...-rockchip-Add-power-controller-for-RK3528.patch | 94 ++
...rm64-dts-rockchip-Add-GPU-node-for-RK3528.patch | 88 ++
...ockchip-Fix-pinctrl-node-names-for-RK3528.patch | 125 ++
...-rockchip-Fix-UART-DMA-support-for-RK3528.patch | 106 ++
...-rockchip-convert-rk3528-power-domains-to.patch | 85 ++
...ts-rockchip-Add-naneng-combphy-for-RK3528.patch | 55 +
...chip-Enable-more-power-domains-for-RK3528.patch | 261 ++++
...rockchip-Add-rk3528-CPU-frequency-scaling.patch | 98 ++
...hip-Add-PCIe-Gen2x1-controller-for-RK3528.patch | 92 ++
26 files changed, 4142 insertions(+)
diff --git a/target/linux/rockchip/patches-6.12/070-01-v6.13-arm64-dts-rockchip-Add-base-DT-for-rk3528-SoC.patch b/target/linux/rockchip/patches-6.12/070-01-v6.13-arm64-dts-rockchip-Add-base-DT-for-rk3528-SoC.patch
new file mode 100644
index 0000000000..8108b9581d
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-01-v6.13-arm64-dts-rockchip-Add-base-DT-for-rk3528-SoC.patch
@@ -0,0 +1,210 @@
+From 7983e6c379a917c500eff31f5f9c646cc408e030 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Thu, 29 Aug 2024 09:27:04 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add base DT for rk3528 SoC
+
+This initial device tree describes CPU, interrupts and UART on the chip
+and is able to boot into basic kernel with only UART. Cache information
+is omitted for now as there is no precise documentation. Support for
+other features will be added later.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Link: https://lore.kernel.org/r/20240829092705.6241-4-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 189 +++++++++++++++++++++++
+ 1 file changed, 189 insertions(+)
+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3528.dtsi
+
+--- /dev/null
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -0,0 +1,189 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++/*
++ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
++ * Copyright (c) 2024 Yao Zi <ziyao at disroot.org>
++ */
++
++#include <dt-bindings/interrupt-controller/arm-gic.h>
++#include <dt-bindings/interrupt-controller/irq.h>
++
++/ {
++ compatible = "rockchip,rk3528";
++
++ interrupt-parent = <&gic>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++
++ aliases {
++ serial0 = &uart0;
++ serial1 = &uart1;
++ serial2 = &uart2;
++ serial3 = &uart3;
++ serial4 = &uart4;
++ serial5 = &uart5;
++ serial6 = &uart6;
++ serial7 = &uart7;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu-map {
++ cluster0 {
++ core0 {
++ cpu = <&cpu0>;
++ };
++ core1 {
++ cpu = <&cpu1>;
++ };
++ core2 {
++ cpu = <&cpu2>;
++ };
++ core3 {
++ cpu = <&cpu3>;
++ };
++ };
++ };
++
++ cpu0: cpu at 0 {
++ compatible = "arm,cortex-a53";
++ reg = <0x0>;
++ device_type = "cpu";
++ enable-method = "psci";
++ };
++
++ cpu1: cpu at 1 {
++ compatible = "arm,cortex-a53";
++ reg = <0x1>;
++ device_type = "cpu";
++ enable-method = "psci";
++ };
++
++ cpu2: cpu at 2 {
++ compatible = "arm,cortex-a53";
++ reg = <0x2>;
++ device_type = "cpu";
++ enable-method = "psci";
++ };
++
++ cpu3: cpu at 3 {
++ compatible = "arm,cortex-a53";
++ reg = <0x3>;
++ device_type = "cpu";
++ enable-method = "psci";
++ };
++ };
++
++ psci {
++ compatible = "arm,psci-1.0", "arm,psci-0.2";
++ method = "smc";
++ };
++
++ timer {
++ compatible = "arm,armv8-timer";
++ interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
++ <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
++ <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
++ <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
++ };
++
++ xin24m: clock-xin24m {
++ compatible = "fixed-clock";
++ clock-frequency = <24000000>;
++ clock-output-names = "xin24m";
++ #clock-cells = <0>;
++ };
++
++ soc {
++ compatible = "simple-bus";
++ ranges = <0x0 0xfe000000 0x0 0xfe000000 0x0 0x2000000>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++
++ gic: interrupt-controller at fed01000 {
++ compatible = "arm,gic-400";
++ reg = <0x0 0xfed01000 0 0x1000>,
++ <0x0 0xfed02000 0 0x2000>,
++ <0x0 0xfed04000 0 0x2000>,
++ <0x0 0xfed06000 0 0x2000>;
++ interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) |
++ IRQ_TYPE_LEVEL_LOW)>;
++ interrupt-controller;
++ #address-cells = <0>;
++ #interrupt-cells = <3>;
++ };
++
++ uart0: serial at ff9f0000 {
++ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
++ reg = <0x0 0xff9f0000 0x0 0x100>;
++ clock-frequency = <24000000>;
++ interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
++ reg-io-width = <4>;
++ reg-shift = <2>;
++ status = "disabled";
++ };
++
++ uart1: serial at ff9f8000 {
++ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
++ reg = <0x0 0xff9f8000 0x0 0x100>;
++ interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
++ reg-io-width = <4>;
++ reg-shift = <2>;
++ status = "disabled";
++ };
++
++ uart2: serial at ffa00000 {
++ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
++ reg = <0x0 0xffa00000 0x0 0x100>;
++ interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
++ reg-io-width = <4>;
++ reg-shift = <2>;
++ status = "disabled";
++ };
++
++ uart3: serial at ffa08000 {
++ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
++ reg = <0x0 0xffa08000 0x0 0x100>;
++ reg-io-width = <4>;
++ reg-shift = <2>;
++ status = "disabled";
++ };
++
++ uart4: serial at ffa10000 {
++ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
++ reg = <0x0 0xffa10000 0x0 0x100>;
++ interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
++ reg-io-width = <4>;
++ reg-shift = <2>;
++ status = "disabled";
++ };
++
++ uart5: serial at ffa18000 {
++ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
++ reg = <0x0 0xffa18000 0x0 0x100>;
++ interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
++ reg-io-width = <4>;
++ reg-shift = <2>;
++ status = "disabled";
++ };
++
++ uart6: serial at ffa20000 {
++ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
++ reg = <0x0 0xffa20000 0x0 0x100>;
++ interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
++ reg-io-width = <4>;
++ reg-shift = <2>;
++ status = "disabled";
++ };
++
++ uart7: serial at ffa28000 {
++ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
++ reg = <0x0 0xffa28000 0x0 0x100>;
++ interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
++ reg-io-width = <4>;
++ reg-shift = <2>;
++ status = "disabled";
++ };
++ };
++};
diff --git a/target/linux/rockchip/patches-6.12/070-02-v6.15-arm64-dts-rockchip-Add-clock-generators-for-RK3528-SoC.patch b/target/linux/rockchip/patches-6.12/070-02-v6.15-arm64-dts-rockchip-Add-clock-generators-for-RK3528-SoC.patch
new file mode 100644
index 0000000000..be1ab06ac7
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-02-v6.15-arm64-dts-rockchip-Add-clock-generators-for-RK3528-SoC.patch
@@ -0,0 +1,90 @@
+From 858cdcdd11cf9913756297d3869e4de0f01329ea Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Mon, 17 Feb 2025 06:11:45 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add clock generators for RK3528 SoC
+
+Add dt node for RK3528 clock and reset unit. Clock "gmac0_clk" is
+generated by internal Ethernet phy, a fixed clock node is added as a
+placeholder to avoid orphans.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Link: https://lore.kernel.org/r/20250217061142.38480-9-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 51 ++++++++++++++++++++++++
+ 1 file changed, 51 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -6,6 +6,7 @@
+
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/interrupt-controller/irq.h>
++#include <dt-bindings/clock/rockchip,rk3528-cru.h>
+
+ / {
+ compatible = "rockchip,rk3528";
+@@ -95,6 +96,13 @@
+ #clock-cells = <0>;
+ };
+
++ gmac0_clk: clock-gmac50m {
++ compatible = "fixed-clock";
++ clock-frequency = <50000000>;
++ clock-output-names = "gmac0";
++ #clock-cells = <0>;
++ };
++
+ soc {
+ compatible = "simple-bus";
+ ranges = <0x0 0xfe000000 0x0 0xfe000000 0x0 0x2000000>;
+@@ -114,6 +122,49 @@
+ #interrupt-cells = <3>;
+ };
+
++ cru: clock-controller at ff4a0000 {
++ compatible = "rockchip,rk3528-cru";
++ reg = <0x0 0xff4a0000 0x0 0x30000>;
++ assigned-clocks =
++ <&cru XIN_OSC0_DIV>, <&cru PLL_GPLL>,
++ <&cru PLL_PPLL>, <&cru PLL_CPLL>,
++ <&cru ARMCLK>, <&cru CLK_MATRIX_250M_SRC>,
++ <&cru CLK_MATRIX_500M_SRC>,
++ <&cru CLK_MATRIX_50M_SRC>,
++ <&cru CLK_MATRIX_100M_SRC>,
++ <&cru CLK_MATRIX_150M_SRC>,
++ <&cru CLK_MATRIX_200M_SRC>,
++ <&cru CLK_MATRIX_300M_SRC>,
++ <&cru CLK_MATRIX_339M_SRC>,
++ <&cru CLK_MATRIX_400M_SRC>,
++ <&cru CLK_MATRIX_600M_SRC>,
++ <&cru CLK_PPLL_50M_MATRIX>,
++ <&cru CLK_PPLL_100M_MATRIX>,
++ <&cru CLK_PPLL_125M_MATRIX>,
++ <&cru ACLK_BUS_VOPGL_ROOT>;
++ assigned-clock-rates =
++ <32768>, <1188000000>,
++ <1000000000>, <996000000>,
++ <408000000>, <250000000>,
++ <500000000>,
++ <50000000>,
++ <100000000>,
++ <150000000>,
++ <200000000>,
++ <300000000>,
++ <340000000>,
++ <400000000>,
++ <600000000>,
++ <50000000>,
++ <100000000>,
++ <125000000>,
++ <500000000>;
++ clocks = <&xin24m>, <&gmac0_clk>;
++ clock-names = "xin24m", "gmac0";
++ #clock-cells = <1>;
++ #reset-cells = <1>;
++ };
++
+ uart0: serial at ff9f0000 {
+ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+ reg = <0x0 0xff9f0000 0x0 0x100>;
diff --git a/target/linux/rockchip/patches-6.12/070-03-v6.15-arm64-dts-rockchip-Add-UART-clocks-for-RK3528-SoC.patch b/target/linux/rockchip/patches-6.12/070-03-v6.15-arm64-dts-rockchip-Add-UART-clocks-for-RK3528-SoC.patch
new file mode 100644
index 0000000000..73429779e5
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-03-v6.15-arm64-dts-rockchip-Add-UART-clocks-for-RK3528-SoC.patch
@@ -0,0 +1,89 @@
+From b9454434d0349223418f74fbfa7b902104da9bc5 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Mon, 17 Feb 2025 06:11:46 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add UART clocks for RK3528 SoC
+
+Add missing clocks in UART nodes for RK3528 SoC.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Link: https://lore.kernel.org/r/20250217061142.38480-10-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -168,7 +168,8 @@
+ uart0: serial at ff9f0000 {
+ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+ reg = <0x0 0xff9f0000 0x0 0x100>;
+- clock-frequency = <24000000>;
++ clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
++ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+@@ -178,6 +179,8 @@
+ uart1: serial at ff9f8000 {
+ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+ reg = <0x0 0xff9f8000 0x0 0x100>;
++ clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>;
++ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+@@ -187,6 +190,8 @@
+ uart2: serial at ffa00000 {
+ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+ reg = <0x0 0xffa00000 0x0 0x100>;
++ clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
++ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+@@ -195,6 +200,8 @@
+
+ uart3: serial at ffa08000 {
+ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
++ clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
++ clock-names = "baudclk", "apb_pclk";
+ reg = <0x0 0xffa08000 0x0 0x100>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+@@ -204,6 +211,8 @@
+ uart4: serial at ffa10000 {
+ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+ reg = <0x0 0xffa10000 0x0 0x100>;
++ clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>;
++ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+@@ -213,6 +222,8 @@
+ uart5: serial at ffa18000 {
+ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+ reg = <0x0 0xffa18000 0x0 0x100>;
++ clocks = <&cru SCLK_UART5>, <&cru PCLK_UART5>;
++ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+@@ -222,6 +233,8 @@
+ uart6: serial at ffa20000 {
+ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+ reg = <0x0 0xffa20000 0x0 0x100>;
++ clocks = <&cru SCLK_UART6>, <&cru PCLK_UART6>;
++ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+@@ -231,6 +244,8 @@
+ uart7: serial at ffa28000 {
+ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+ reg = <0x0 0xffa28000 0x0 0x100>;
++ clocks = <&cru SCLK_UART7>, <&cru PCLK_UART7>;
++ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
diff --git a/target/linux/rockchip/patches-6.12/070-04-v6.15-arm64-dts-rockchip-Add-pinctrl-and-gpio-nodes-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-04-v6.15-arm64-dts-rockchip-Add-pinctrl-and-gpio-nodes-for-RK3528.patch
new file mode 100644
index 0000000000..7ee6ff2e93
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-04-v6.15-arm64-dts-rockchip-Add-pinctrl-and-gpio-nodes-for-RK3528.patch
@@ -0,0 +1,1531 @@
+From a31fad19ae39ea27b5068e3b02bcbf30a905339b Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Fri, 28 Feb 2025 06:40:10 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add pinctrl and gpio nodes for RK3528
+
+Add pinctrl and gpio nodes for RK3528 and import rk3528-pinctrl.dtsi
+from vendor linux-6.1-stan-rkr5 kernel with the hdmi-pins-idle node
+removed due to missing label reference to pcfg_output_low_pull_down.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250228064024.3200000-5-jonas@kwiboo.se
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ .../boot/dts/rockchip/rk3528-pinctrl.dtsi | 1397 +++++++++++++++++
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 82 +
+ 2 files changed, 1479 insertions(+)
+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi
+
+--- /dev/null
++++ b/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi
+@@ -0,0 +1,1397 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++/*
++ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
++ */
++
++#include <dt-bindings/pinctrl/rockchip.h>
++#include "rockchip-pinconf.dtsi"
++
++/*
++ * This file is auto generated by pin2dts tool, please keep these code
++ * by adding changes at end of this file.
++ */
++&pinctrl {
++ arm {
++ /omit-if-no-ref/
++ arm_pins: arm-pins {
++ rockchip,pins =
++ /* arm_avs */
++ <4 RK_PC4 3 &pcfg_pull_none>;
++ };
++ };
++
++ clk {
++ /omit-if-no-ref/
++ clkm0_32k_out: clkm0-32k-out {
++ rockchip,pins =
++ /* clkm0_32k_out */
++ <3 RK_PC3 3 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ clkm1_32k_out: clkm1-32k-out {
++ rockchip,pins =
++ /* clkm1_32k_out */
++ <1 RK_PC3 1 &pcfg_pull_none>;
++ };
++ };
++
++ emmc {
++ /omit-if-no-ref/
++ emmc_rstnout: emmc-rstnout {
++ rockchip,pins =
++ /* emmc_rstn */
++ <1 RK_PD6 1 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ emmc_bus8: emmc-bus8 {
++ rockchip,pins =
++ /* emmc_d0 */
++ <1 RK_PC4 1 &pcfg_pull_up_drv_level_2>,
++ /* emmc_d1 */
++ <1 RK_PC5 1 &pcfg_pull_up_drv_level_2>,
++ /* emmc_d2 */
++ <1 RK_PC6 1 &pcfg_pull_up_drv_level_2>,
++ /* emmc_d3 */
++ <1 RK_PC7 1 &pcfg_pull_up_drv_level_2>,
++ /* emmc_d4 */
++ <1 RK_PD0 1 &pcfg_pull_up_drv_level_2>,
++ /* emmc_d5 */
++ <1 RK_PD1 1 &pcfg_pull_up_drv_level_2>,
++ /* emmc_d6 */
++ <1 RK_PD2 1 &pcfg_pull_up_drv_level_2>,
++ /* emmc_d7 */
++ <1 RK_PD3 1 &pcfg_pull_up_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ emmc_clk: emmc-clk {
++ rockchip,pins =
++ /* emmc_clk */
++ <1 RK_PD5 1 &pcfg_pull_up_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ emmc_cmd: emmc-cmd {
++ rockchip,pins =
++ /* emmc_cmd */
++ <1 RK_PD4 1 &pcfg_pull_up_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ emmc_strb: emmc-strb {
++ rockchip,pins =
++ /* emmc_strb */
++ <1 RK_PD7 1 &pcfg_pull_none>;
++ };
++ };
++
++ eth {
++ /omit-if-no-ref/
++ eth_pins: eth-pins {
++ rockchip,pins =
++ /* eth_clk_25m_out */
++ <3 RK_PB5 2 &pcfg_pull_none_drv_level_2>;
++ };
++ };
++
++ fephy {
++ /omit-if-no-ref/
++ fephym0_led_dpx: fephym0-led_dpx {
++ rockchip,pins =
++ /* fephy_led_dpx_m0 */
++ <4 RK_PB5 2 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ fephym0_led_link: fephym0-led_link {
++ rockchip,pins =
++ /* fephy_led_link_m0 */
++ <4 RK_PC0 2 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ fephym0_led_spd: fephym0-led_spd {
++ rockchip,pins =
++ /* fephy_led_spd_m0 */
++ <4 RK_PB7 2 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ fephym1_led_dpx: fephym1-led_dpx {
++ rockchip,pins =
++ /* fephy_led_dpx_m1 */
++ <2 RK_PA4 5 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ fephym1_led_link: fephym1-led_link {
++ rockchip,pins =
++ /* fephy_led_link_m1 */
++ <2 RK_PA6 5 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ fephym1_led_spd: fephym1-led_spd {
++ rockchip,pins =
++ /* fephy_led_spd_m1 */
++ <2 RK_PA5 5 &pcfg_pull_none>;
++ };
++ };
++
++ fspi {
++ /omit-if-no-ref/
++ fspi_pins: fspi-pins {
++ rockchip,pins =
++ /* fspi_clk */
++ <1 RK_PD5 2 &pcfg_pull_none>,
++ /* fspi_d0 */
++ <1 RK_PC4 2 &pcfg_pull_none>,
++ /* fspi_d1 */
++ <1 RK_PC5 2 &pcfg_pull_none>,
++ /* fspi_d2 */
++ <1 RK_PC6 2 &pcfg_pull_none>,
++ /* fspi_d3 */
++ <1 RK_PC7 2 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ fspi_csn0: fspi-csn0 {
++ rockchip,pins =
++ /* fspi_csn0 */
++ <1 RK_PD0 2 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ fspi_csn1: fspi-csn1 {
++ rockchip,pins =
++ /* fspi_csn1 */
++ <1 RK_PD1 2 &pcfg_pull_none>;
++ };
++ };
++
++ gpu {
++ /omit-if-no-ref/
++ gpu_pins: gpu-pins {
++ rockchip,pins =
++ /* gpu_avs */
++ <4 RK_PC3 3 &pcfg_pull_none>;
++ };
++ };
++
++ hdmi {
++ /omit-if-no-ref/
++ hdmi_pins: hdmi-pins {
++ rockchip,pins =
++ /* hdmi_tx_cec */
++ <0 RK_PA3 1 &pcfg_pull_none>,
++ /* hdmi_tx_hpd */
++ <0 RK_PA2 1 &pcfg_pull_none>,
++ /* hdmi_tx_scl */
++ <0 RK_PA4 1 &pcfg_pull_none>,
++ /* hdmi_tx_sda */
++ <0 RK_PA5 1 &pcfg_pull_none>;
++ };
++ };
++
++ hsm {
++ /omit-if-no-ref/
++ hsmm0_pins: hsmm0-pins {
++ rockchip,pins =
++ /* hsm_clk_out_m0 */
++ <2 RK_PA2 4 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ hsmm1_pins: hsmm1-pins {
++ rockchip,pins =
++ /* hsm_clk_out_m1 */
++ <1 RK_PA4 3 &pcfg_pull_none>;
++ };
++ };
++
++ i2c0 {
++ /omit-if-no-ref/
++ i2c0m0_xfer: i2c0m0-xfer {
++ rockchip,pins =
++ /* i2c0_scl_m0 */
++ <4 RK_PC4 2 &pcfg_pull_none_smt>,
++ /* i2c0_sda_m0 */
++ <4 RK_PC3 2 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2c0m1_xfer: i2c0m1-xfer {
++ rockchip,pins =
++ /* i2c0_scl_m1 */
++ <4 RK_PA1 2 &pcfg_pull_none_smt>,
++ /* i2c0_sda_m1 */
++ <4 RK_PA0 2 &pcfg_pull_none_smt>;
++ };
++ };
++
++ i2c1 {
++ /omit-if-no-ref/
++ i2c1m0_xfer: i2c1m0-xfer {
++ rockchip,pins =
++ /* i2c1_scl_m0 */
++ <4 RK_PA3 2 &pcfg_pull_none_smt>,
++ /* i2c1_sda_m0 */
++ <4 RK_PA2 2 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2c1m1_xfer: i2c1m1-xfer {
++ rockchip,pins =
++ /* i2c1_scl_m1 */
++ <4 RK_PC5 4 &pcfg_pull_none_smt>,
++ /* i2c1_sda_m1 */
++ <4 RK_PC6 4 &pcfg_pull_none_smt>;
++ };
++ };
++
++ i2c2 {
++ /omit-if-no-ref/
++ i2c2m0_xfer: i2c2m0-xfer {
++ rockchip,pins =
++ /* i2c2_scl_m0 */
++ <0 RK_PA4 2 &pcfg_pull_none_smt>,
++ /* i2c2_sda_m0 */
++ <0 RK_PA5 2 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2c2m1_xfer: i2c2m1-xfer {
++ rockchip,pins =
++ /* i2c2_scl_m1 */
++ <1 RK_PA5 3 &pcfg_pull_none_smt>,
++ /* i2c2_sda_m1 */
++ <1 RK_PA6 3 &pcfg_pull_none_smt>;
++ };
++ };
++
++ i2c3 {
++ /omit-if-no-ref/
++ i2c3m0_xfer: i2c3m0-xfer {
++ rockchip,pins =
++ /* i2c3_scl_m0 */
++ <1 RK_PA0 2 &pcfg_pull_none_smt>,
++ /* i2c3_sda_m0 */
++ <1 RK_PA1 2 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2c3m1_xfer: i2c3m1-xfer {
++ rockchip,pins =
++ /* i2c3_scl_m1 */
++ <3 RK_PC1 5 &pcfg_pull_none_smt>,
++ /* i2c3_sda_m1 */
++ <3 RK_PC3 5 &pcfg_pull_none_smt>;
++ };
++ };
++
++ i2c4 {
++ /omit-if-no-ref/
++ i2c4_xfer: i2c4-xfer {
++ rockchip,pins =
++ /* i2c4_scl */
++ <2 RK_PA0 4 &pcfg_pull_none_smt>,
++ /* i2c4_sda */
++ <2 RK_PA1 4 &pcfg_pull_none_smt>;
++ };
++ };
++
++ i2c5 {
++ /omit-if-no-ref/
++ i2c5m0_xfer: i2c5m0-xfer {
++ rockchip,pins =
++ /* i2c5_scl_m0 */
++ <1 RK_PB2 3 &pcfg_pull_none_smt>,
++ /* i2c5_sda_m0 */
++ <1 RK_PB3 3 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2c5m1_xfer: i2c5m1-xfer {
++ rockchip,pins =
++ /* i2c5_scl_m1 */
++ <1 RK_PD2 3 &pcfg_pull_none_smt>,
++ /* i2c5_sda_m1 */
++ <1 RK_PD3 3 &pcfg_pull_none_smt>;
++ };
++ };
++
++ i2c6 {
++ /omit-if-no-ref/
++ i2c6m0_xfer: i2c6m0-xfer {
++ rockchip,pins =
++ /* i2c6_scl_m0 */
++ <3 RK_PB2 5 &pcfg_pull_none_smt>,
++ /* i2c6_sda_m0 */
++ <3 RK_PB3 5 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2c6m1_xfer: i2c6m1-xfer {
++ rockchip,pins =
++ /* i2c6_scl_m1 */
++ <1 RK_PD4 3 &pcfg_pull_none_smt>,
++ /* i2c6_sda_m1 */
++ <1 RK_PD7 3 &pcfg_pull_none_smt>;
++ };
++ };
++
++ i2c7 {
++ /omit-if-no-ref/
++ i2c7_xfer: i2c7-xfer {
++ rockchip,pins =
++ /* i2c7_scl */
++ <2 RK_PA5 4 &pcfg_pull_none_smt>,
++ /* i2c7_sda */
++ <2 RK_PA6 4 &pcfg_pull_none_smt>;
++ };
++ };
++
++ i2s0 {
++ /omit-if-no-ref/
++ i2s0m0_lrck: i2s0m0-lrck {
++ rockchip,pins =
++ /* i2s0_lrck_m0 */
++ <3 RK_PB6 1 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2s0m0_mclk: i2s0m0-mclk {
++ rockchip,pins =
++ /* i2s0_mclk_m0 */
++ <3 RK_PB4 1 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2s0m0_sclk: i2s0m0-sclk {
++ rockchip,pins =
++ /* i2s0_sclk_m0 */
++ <3 RK_PB5 1 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2s0m0_sdi: i2s0m0-sdi {
++ rockchip,pins =
++ /* i2s0m0_sdi */
++ <3 RK_PB7 1 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ i2s0m0_sdo: i2s0m0-sdo {
++ rockchip,pins =
++ /* i2s0m0_sdo */
++ <3 RK_PC0 1 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ i2s0m1_lrck: i2s0m1-lrck {
++ rockchip,pins =
++ /* i2s0_lrck_m1 */
++ <1 RK_PB6 1 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2s0m1_mclk: i2s0m1-mclk {
++ rockchip,pins =
++ /* i2s0_mclk_m1 */
++ <1 RK_PB4 1 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2s0m1_sclk: i2s0m1-sclk {
++ rockchip,pins =
++ /* i2s0_sclk_m1 */
++ <1 RK_PB5 1 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2s0m1_sdi: i2s0m1-sdi {
++ rockchip,pins =
++ /* i2s0m1_sdi */
++ <1 RK_PB7 1 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ i2s0m1_sdo: i2s0m1-sdo {
++ rockchip,pins =
++ /* i2s0m1_sdo */
++ <1 RK_PC0 1 &pcfg_pull_none>;
++ };
++ };
++
++ i2s1 {
++ /omit-if-no-ref/
++ i2s1_lrck: i2s1-lrck {
++ rockchip,pins =
++ /* i2s1_lrck */
++ <4 RK_PA6 1 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2s1_mclk: i2s1-mclk {
++ rockchip,pins =
++ /* i2s1_mclk */
++ <4 RK_PA4 1 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2s1_sclk: i2s1-sclk {
++ rockchip,pins =
++ /* i2s1_sclk */
++ <4 RK_PA5 1 &pcfg_pull_none_smt>;
++ };
++
++ /omit-if-no-ref/
++ i2s1_sdi0: i2s1-sdi0 {
++ rockchip,pins =
++ /* i2s1_sdi0 */
++ <4 RK_PB4 1 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ i2s1_sdi1: i2s1-sdi1 {
++ rockchip,pins =
++ /* i2s1_sdi1 */
++ <4 RK_PB3 1 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ i2s1_sdi2: i2s1-sdi2 {
++ rockchip,pins =
++ /* i2s1_sdi2 */
++ <4 RK_PA3 1 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ i2s1_sdi3: i2s1-sdi3 {
++ rockchip,pins =
++ /* i2s1_sdi3 */
++ <4 RK_PA2 1 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ i2s1_sdo0: i2s1-sdo0 {
++ rockchip,pins =
++ /* i2s1_sdo0 */
++ <4 RK_PA7 1 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ i2s1_sdo1: i2s1-sdo1 {
++ rockchip,pins =
++ /* i2s1_sdo1 */
++ <4 RK_PB0 1 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ i2s1_sdo2: i2s1-sdo2 {
++ rockchip,pins =
++ /* i2s1_sdo2 */
++ <4 RK_PB1 1 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ i2s1_sdo3: i2s1-sdo3 {
++ rockchip,pins =
++ /* i2s1_sdo3 */
++ <4 RK_PB2 1 &pcfg_pull_none>;
++ };
++ };
++
++ jtag {
++ /omit-if-no-ref/
++ jtagm0_pins: jtagm0-pins {
++ rockchip,pins =
++ /* jtag_cpu_tck_m0 */
++ <2 RK_PA2 2 &pcfg_pull_none>,
++ /* jtag_cpu_tms_m0 */
++ <2 RK_PA3 2 &pcfg_pull_none>,
++ /* jtag_mcu_tck_m0 */
++ <2 RK_PA4 2 &pcfg_pull_none>,
++ /* jtag_mcu_tms_m0 */
++ <2 RK_PA5 2 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ jtagm1_pins: jtagm1-pins {
++ rockchip,pins =
++ /* jtag_cpu_tck_m1 */
++ <4 RK_PD0 2 &pcfg_pull_none>,
++ /* jtag_cpu_tms_m1 */
++ <4 RK_PC7 2 &pcfg_pull_none>,
++ /* jtag_mcu_tck_m1 */
++ <4 RK_PD0 3 &pcfg_pull_none>,
++ /* jtag_mcu_tms_m1 */
++ <4 RK_PC7 3 &pcfg_pull_none>;
++ };
++ };
++
++ pcie {
++ /omit-if-no-ref/
++ pciem0_pins: pciem0-pins {
++ rockchip,pins =
++ /* pcie_clkreqn_m0 */
++ <3 RK_PA6 5 &pcfg_pull_none>,
++ /* pcie_perstn_m0 */
++ <3 RK_PB0 5 &pcfg_pull_none>,
++ /* pcie_waken_m0 */
++ <3 RK_PA7 5 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ pciem1_pins: pciem1-pins {
++ rockchip,pins =
++ /* pcie_clkreqn_m1 */
++ <1 RK_PA0 4 &pcfg_pull_none>,
++ /* pcie_perstn_m1 */
++ <1 RK_PA2 4 &pcfg_pull_none>,
++ /* pcie_waken_m1 */
++ <1 RK_PA1 4 &pcfg_pull_none>;
++ };
++ };
++
++ pdm {
++ /omit-if-no-ref/
++ pdm_clk0: pdm-clk0 {
++ rockchip,pins =
++ /* pdm_clk0 */
++ <4 RK_PB5 3 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ pdm_clk1: pdm-clk1 {
++ rockchip,pins =
++ /* pdm_clk1 */
++ <4 RK_PA4 3 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ pdm_sdi0: pdm-sdi0 {
++ rockchip,pins =
++ /* pdm_sdi0 */
++ <4 RK_PB2 3 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ pdm_sdi1: pdm-sdi1 {
++ rockchip,pins =
++ /* pdm_sdi1 */
++ <4 RK_PB1 3 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ pdm_sdi2: pdm-sdi2 {
++ rockchip,pins =
++ /* pdm_sdi2 */
++ <4 RK_PB3 3 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ pdm_sdi3: pdm-sdi3 {
++ rockchip,pins =
++ /* pdm_sdi3 */
++ <4 RK_PC1 3 &pcfg_pull_none>;
++ };
++ };
++
++ pmu {
++ /omit-if-no-ref/
++ pmu_pins: pmu-pins {
++ rockchip,pins =
++ /* pmu_debug */
++ <4 RK_PA0 4 &pcfg_pull_none>;
++ };
++ };
++
++ pwm0 {
++ /omit-if-no-ref/
++ pwm0m0_pins: pwm0m0-pins {
++ rockchip,pins =
++ /* pwm0_m0 */
++ <4 RK_PC3 1 &pcfg_pull_none_drv_level_0>;
++ };
++
++ /omit-if-no-ref/
++ pwm0m1_pins: pwm0m1-pins {
++ rockchip,pins =
++ /* pwm0_m1 */
++ <1 RK_PA2 5 &pcfg_pull_none_drv_level_0>;
++ };
++ };
++
++ pwm1 {
++ /omit-if-no-ref/
++ pwm1m0_pins: pwm1m0-pins {
++ rockchip,pins =
++ /* pwm1_m0 */
++ <4 RK_PC4 1 &pcfg_pull_none_drv_level_0>;
++ };
++
++ /omit-if-no-ref/
++ pwm1m1_pins: pwm1m1-pins {
++ rockchip,pins =
++ /* pwm1_m1 */
++ <1 RK_PA3 4 &pcfg_pull_none_drv_level_0>;
++ };
++ };
++
++ pwm2 {
++ /omit-if-no-ref/
++ pwm2m0_pins: pwm2m0-pins {
++ rockchip,pins =
++ /* pwm2_m0 */
++ <4 RK_PC5 1 &pcfg_pull_none_drv_level_0>;
++ };
++
++ /omit-if-no-ref/
++ pwm2m1_pins: pwm2m1-pins {
++ rockchip,pins =
++ /* pwm2_m1 */
++ <1 RK_PA7 2 &pcfg_pull_none_drv_level_0>;
++ };
++ };
++
++ pwm3 {
++ /omit-if-no-ref/
++ pwm3m0_pins: pwm3m0-pins {
++ rockchip,pins =
++ /* pwm3_m0 */
++ <4 RK_PC6 1 &pcfg_pull_none_drv_level_0>;
++ };
++
++ /omit-if-no-ref/
++ pwm3m1_pins: pwm3m1-pins {
++ rockchip,pins =
++ /* pwm3_m1 */
++ <2 RK_PA4 3 &pcfg_pull_none_drv_level_0>;
++ };
++ };
++
++ pwm4 {
++ /omit-if-no-ref/
++ pwm4m0_pins: pwm4m0-pins {
++ rockchip,pins =
++ /* pwm4_m0 */
++ <4 RK_PB7 1 &pcfg_pull_none_drv_level_0>;
++ };
++
++ /omit-if-no-ref/
++ pwm4m1_pins: pwm4m1-pins {
++ rockchip,pins =
++ /* pwm4_m1 */
++ <1 RK_PA4 2 &pcfg_pull_none_drv_level_0>;
++ };
++ };
++
++ pwm5 {
++ /omit-if-no-ref/
++ pwm5m0_pins: pwm5m0-pins {
++ rockchip,pins =
++ /* pwm5_m0 */
++ <4 RK_PC0 1 &pcfg_pull_none_drv_level_0>;
++ };
++
++ /omit-if-no-ref/
++ pwm5m1_pins: pwm5m1-pins {
++ rockchip,pins =
++ /* pwm5_m1 */
++ <3 RK_PC3 1 &pcfg_pull_none_drv_level_0>;
++ };
++ };
++
++ pwm6 {
++ /omit-if-no-ref/
++ pwm6m0_pins: pwm6m0-pins {
++ rockchip,pins =
++ /* pwm6_m0 */
++ <4 RK_PC1 1 &pcfg_pull_none_drv_level_0>;
++ };
++
++ /omit-if-no-ref/
++ pwm6m1_pins: pwm6m1-pins {
++ rockchip,pins =
++ /* pwm6_m1 */
++ <1 RK_PC3 3 &pcfg_pull_none_drv_level_0>;
++ };
++
++ /omit-if-no-ref/
++ pwm6m2_pins: pwm6m2-pins {
++ rockchip,pins =
++ /* pwm6_m2 */
++ <3 RK_PC1 1 &pcfg_pull_none_drv_level_0>;
++ };
++ };
++
++ pwm7 {
++ /omit-if-no-ref/
++ pwm7m0_pins: pwm7m0-pins {
++ rockchip,pins =
++ /* pwm7_m0 */
++ <4 RK_PC2 1 &pcfg_pull_none_drv_level_0>;
++ };
++
++ /omit-if-no-ref/
++ pwm7m1_pins: pwm7m1-pins {
++ rockchip,pins =
++ /* pwm7_m1 */
++ <1 RK_PC2 2 &pcfg_pull_none_drv_level_0>;
++ };
++ };
++
++ pwr {
++ /omit-if-no-ref/
++ pwr_pins: pwr-pins {
++ rockchip,pins =
++ /* pwr_ctrl0 */
++ <4 RK_PC2 2 &pcfg_pull_none>,
++ /* pwr_ctrl1 */
++ <4 RK_PB6 1 &pcfg_pull_none>;
++ };
++ };
++
++ ref {
++ /omit-if-no-ref/
++ refm0_pins: refm0-pins {
++ rockchip,pins =
++ /* ref_clk_out_m0 */
++ <0 RK_PA1 1 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ refm1_pins: refm1-pins {
++ rockchip,pins =
++ /* ref_clk_out_m1 */
++ <3 RK_PC3 6 &pcfg_pull_none>;
++ };
++ };
++
++ rgmii {
++ /omit-if-no-ref/
++ rgmii_miim: rgmii-miim {
++ rockchip,pins =
++ /* rgmii_mdc */
++ <3 RK_PB6 2 &pcfg_pull_none_drv_level_2>,
++ /* rgmii_mdio */
++ <3 RK_PB7 2 &pcfg_pull_none_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ rgmii_rx_bus2: rgmii-rx_bus2 {
++ rockchip,pins =
++ /* rgmii_rxd0 */
++ <3 RK_PA3 2 &pcfg_pull_none>,
++ /* rgmii_rxd1 */
++ <3 RK_PA2 2 &pcfg_pull_none>,
++ /* rgmii_rxdv_crs */
++ <3 RK_PC2 2 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ rgmii_tx_bus2: rgmii-tx_bus2 {
++ rockchip,pins =
++ /* rgmii_txd0 */
++ <3 RK_PA1 2 &pcfg_pull_none_drv_level_2>,
++ /* rgmii_txd1 */
++ <3 RK_PA0 2 &pcfg_pull_none_drv_level_2>,
++ /* rgmii_txen */
++ <3 RK_PC0 2 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ rgmii_rgmii_clk: rgmii-rgmii_clk {
++ rockchip,pins =
++ /* rgmii_rxclk */
++ <3 RK_PA5 2 &pcfg_pull_none>,
++ /* rgmii_txclk */
++ <3 RK_PA4 2 &pcfg_pull_none_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ rgmii_rgmii_bus: rgmii-rgmii_bus {
++ rockchip,pins =
++ /* rgmii_rxd2 */
++ <3 RK_PA7 2 &pcfg_pull_none>,
++ /* rgmii_rxd3 */
++ <3 RK_PA6 2 &pcfg_pull_none>,
++ /* rgmii_txd2 */
++ <3 RK_PB1 2 &pcfg_pull_none_drv_level_2>,
++ /* rgmii_txd3 */
++ <3 RK_PB0 2 &pcfg_pull_none_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ rgmii_clk: rgmii-clk {
++ rockchip,pins =
++ /* rgmii_clk */
++ <3 RK_PB4 2 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ rgmii_txer: rgmii-txer {
++ rockchip,pins =
++ /* rgmii_txer */
++ <3 RK_PC1 2 &pcfg_pull_none>;
++ };
++ };
++
++ scr {
++ /omit-if-no-ref/
++ scrm0_pins: scrm0-pins {
++ rockchip,pins =
++ /* scr_clk_m0 */
++ <1 RK_PA2 3 &pcfg_pull_none>,
++ /* scr_data_m0 */
++ <1 RK_PA1 3 &pcfg_pull_none>,
++ /* scr_detn_m0 */
++ <1 RK_PA0 3 &pcfg_pull_none>,
++ /* scr_rstn_m0 */
++ <1 RK_PA3 3 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ scrm1_pins: scrm1-pins {
++ rockchip,pins =
++ /* scr_clk_m1 */
++ <2 RK_PA5 3 &pcfg_pull_none>,
++ /* scr_data_m1 */
++ <2 RK_PA3 4 &pcfg_pull_none>,
++ /* scr_detn_m1 */
++ <2 RK_PA6 3 &pcfg_pull_none>,
++ /* scr_rstn_m1 */
++ <2 RK_PA4 4 &pcfg_pull_none>;
++ };
++ };
++
++ sdio0 {
++ /omit-if-no-ref/
++ sdio0_bus4: sdio0-bus4 {
++ rockchip,pins =
++ /* sdio0_d0 */
++ <1 RK_PA0 1 &pcfg_pull_up_drv_level_2>,
++ /* sdio0_d1 */
++ <1 RK_PA1 1 &pcfg_pull_up_drv_level_2>,
++ /* sdio0_d2 */
++ <1 RK_PA2 1 &pcfg_pull_up_drv_level_2>,
++ /* sdio0_d3 */
++ <1 RK_PA3 1 &pcfg_pull_up_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ sdio0_clk: sdio0-clk {
++ rockchip,pins =
++ /* sdio0_clk */
++ <1 RK_PA5 1 &pcfg_pull_up_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ sdio0_cmd: sdio0-cmd {
++ rockchip,pins =
++ /* sdio0_cmd */
++ <1 RK_PA4 1 &pcfg_pull_up_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ sdio0_det: sdio0-det {
++ rockchip,pins =
++ /* sdio0_det */
++ <1 RK_PA6 1 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ sdio0_pwren: sdio0-pwren {
++ rockchip,pins =
++ /* sdio0_pwren */
++ <1 RK_PA7 1 &pcfg_pull_none>;
++ };
++ };
++
++ sdio1 {
++ /omit-if-no-ref/
++ sdio1_bus4: sdio1-bus4 {
++ rockchip,pins =
++ /* sdio1_d0 */
++ <3 RK_PA6 1 &pcfg_pull_up_drv_level_2>,
++ /* sdio1_d1 */
++ <3 RK_PA7 1 &pcfg_pull_up_drv_level_2>,
++ /* sdio1_d2 */
++ <3 RK_PB0 1 &pcfg_pull_up_drv_level_2>,
++ /* sdio1_d3 */
++ <3 RK_PB1 1 &pcfg_pull_up_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ sdio1_clk: sdio1-clk {
++ rockchip,pins =
++ /* sdio1_clk */
++ <3 RK_PA4 1 &pcfg_pull_up_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ sdio1_cmd: sdio1-cmd {
++ rockchip,pins =
++ /* sdio1_cmd */
++ <3 RK_PA5 1 &pcfg_pull_up_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ sdio1_det: sdio1-det {
++ rockchip,pins =
++ /* sdio1_det */
++ <3 RK_PB3 1 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ sdio1_pwren: sdio1-pwren {
++ rockchip,pins =
++ /* sdio1_pwren */
++ <3 RK_PB2 1 &pcfg_pull_none>;
++ };
++ };
++
++ sdmmc {
++ /omit-if-no-ref/
++ sdmmc_bus4: sdmmc-bus4 {
++ rockchip,pins =
++ /* sdmmc_d0 */
++ <2 RK_PA0 1 &pcfg_pull_up_drv_level_2>,
++ /* sdmmc_d1 */
++ <2 RK_PA1 1 &pcfg_pull_up_drv_level_2>,
++ /* sdmmc_d2 */
++ <2 RK_PA2 1 &pcfg_pull_up_drv_level_2>,
++ /* sdmmc_d3 */
++ <2 RK_PA3 1 &pcfg_pull_up_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ sdmmc_clk: sdmmc-clk {
++ rockchip,pins =
++ /* sdmmc_clk */
++ <2 RK_PA5 1 &pcfg_pull_up_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ sdmmc_cmd: sdmmc-cmd {
++ rockchip,pins =
++ /* sdmmc_cmd */
++ <2 RK_PA4 1 &pcfg_pull_up_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ sdmmc_det: sdmmc-det {
++ rockchip,pins =
++ /* sdmmc_detn */
++ <2 RK_PA6 1 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ sdmmc_pwren: sdmmc-pwren {
++ rockchip,pins =
++ /* sdmmc_pwren */
++ <4 RK_PA1 1 &pcfg_pull_none>;
++ };
++ };
++
++ spdif {
++ /omit-if-no-ref/
++ spdifm0_pins: spdifm0-pins {
++ rockchip,pins =
++ /* spdif_tx_m0 */
++ <4 RK_PA0 1 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ spdifm1_pins: spdifm1-pins {
++ rockchip,pins =
++ /* spdif_tx_m1 */
++ <1 RK_PC3 2 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ spdifm2_pins: spdifm2-pins {
++ rockchip,pins =
++ /* spdif_tx_m2 */
++ <3 RK_PC3 2 &pcfg_pull_none>;
++ };
++ };
++
++ spi0 {
++ /omit-if-no-ref/
++ spi0_pins: spi0-pins {
++ rockchip,pins =
++ /* spi0_clk */
++ <4 RK_PB4 2 &pcfg_pull_none_drv_level_2>,
++ /* spi0_miso */
++ <4 RK_PB3 2 &pcfg_pull_none_drv_level_2>,
++ /* spi0_mosi */
++ <4 RK_PB2 2 &pcfg_pull_none_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ spi0_csn0: spi0-csn0 {
++ rockchip,pins =
++ /* spi0_csn0 */
++ <4 RK_PB6 2 &pcfg_pull_none_drv_level_2>;
++ };
++ /omit-if-no-ref/
++ spi0_csn1: spi0-csn1 {
++ rockchip,pins =
++ /* spi0_csn1 */
++ <4 RK_PC1 2 &pcfg_pull_none_drv_level_2>;
++ };
++ };
++
++ spi1 {
++ /omit-if-no-ref/
++ spi1_pins: spi1-pins {
++ rockchip,pins =
++ /* spi1_clk */
++ <1 RK_PB6 2 &pcfg_pull_none_drv_level_2>,
++ /* spi1_miso */
++ <1 RK_PC0 2 &pcfg_pull_none_drv_level_2>,
++ /* spi1_mosi */
++ <1 RK_PB7 2 &pcfg_pull_none_drv_level_2>;
++ };
++
++ /omit-if-no-ref/
++ spi1_csn0: spi1-csn0 {
++ rockchip,pins =
++ /* spi1_csn0 */
++ <1 RK_PC1 1 &pcfg_pull_none_drv_level_2>;
++ };
++ /omit-if-no-ref/
++ spi1_csn1: spi1-csn1 {
++ rockchip,pins =
++ /* spi1_csn1 */
++ <1 RK_PC2 1 &pcfg_pull_none_drv_level_2>;
++ };
++ };
++
++ tsi0 {
++ /omit-if-no-ref/
++ tsi0_pins: tsi0-pins {
++ rockchip,pins =
++ /* tsi0_clkin */
++ <3 RK_PB2 3 &pcfg_pull_none>,
++ /* tsi0_d0 */
++ <3 RK_PB1 3 &pcfg_pull_none>,
++ /* tsi0_d1 */
++ <3 RK_PB5 3 &pcfg_pull_none>,
++ /* tsi0_d2 */
++ <3 RK_PB6 3 &pcfg_pull_none>,
++ /* tsi0_d3 */
++ <3 RK_PB7 3 &pcfg_pull_none>,
++ /* tsi0_d4 */
++ <3 RK_PA3 3 &pcfg_pull_none>,
++ /* tsi0_d5 */
++ <3 RK_PA2 3 &pcfg_pull_none>,
++ /* tsi0_d6 */
++ <3 RK_PA1 3 &pcfg_pull_none>,
++ /* tsi0_d7 */
++ <3 RK_PA0 3 &pcfg_pull_none>,
++ /* tsi0_fail */
++ <3 RK_PC0 3 &pcfg_pull_none>,
++ /* tsi0_sync */
++ <3 RK_PB4 3 &pcfg_pull_none>,
++ /* tsi0_valid */
++ <3 RK_PB3 3 &pcfg_pull_none>;
++ };
++ };
++
++ tsi1 {
++ /omit-if-no-ref/
++ tsi1_pins: tsi1-pins {
++ rockchip,pins =
++ /* tsi1_clkin */
++ <3 RK_PA5 3 &pcfg_pull_none>,
++ /* tsi1_d0 */
++ <3 RK_PA4 3 &pcfg_pull_none>,
++ /* tsi1_sync */
++ <3 RK_PA7 3 &pcfg_pull_none>,
++ /* tsi1_valid */
++ <3 RK_PA6 3 &pcfg_pull_none>;
++ };
++ };
++
++ uart0 {
++ /omit-if-no-ref/
++ uart0m0_xfer: uart0m0-xfer {
++ rockchip,pins =
++ /* uart0_rx_m0 */
++ <4 RK_PC7 1 &pcfg_pull_up>,
++ /* uart0_tx_m0 */
++ <4 RK_PD0 1 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart0m1_xfer: uart0m1-xfer {
++ rockchip,pins =
++ /* uart0_rx_m1 */
++ <2 RK_PA0 2 &pcfg_pull_up>,
++ /* uart0_tx_m1 */
++ <2 RK_PA1 2 &pcfg_pull_up>;
++ };
++ };
++
++ uart1 {
++ /omit-if-no-ref/
++ uart1m0_xfer: uart1m0-xfer {
++ rockchip,pins =
++ /* uart1_rx_m0 */
++ <4 RK_PA7 2 &pcfg_pull_up>,
++ /* uart1_tx_m0 */
++ <4 RK_PA6 2 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart1m1_xfer: uart1m1-xfer {
++ rockchip,pins =
++ /* uart1_rx_m1 */
++ <4 RK_PC6 2 &pcfg_pull_up>,
++ /* uart1_tx_m1 */
++ <4 RK_PC5 2 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart1_ctsn: uart1-ctsn {
++ rockchip,pins =
++ /* uart1_ctsn */
++ <4 RK_PA4 2 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ uart1_rtsn: uart1-rtsn {
++ rockchip,pins =
++ /* uart1_rtsn */
++ <4 RK_PA5 2 &pcfg_pull_none>;
++ };
++ };
++
++ uart2 {
++ /omit-if-no-ref/
++ uart2m0_xfer: uart2m0-xfer {
++ rockchip,pins =
++ /* uart2_rx_m0 */
++ <3 RK_PA0 1 &pcfg_pull_up>,
++ /* uart2_tx_m0 */
++ <3 RK_PA1 1 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart2m0_ctsn: uart2m0-ctsn {
++ rockchip,pins =
++ /* uart2m0_ctsn */
++ <3 RK_PA3 1 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ uart2m0_rtsn: uart2m0-rtsn {
++ rockchip,pins =
++ /* uart2m0_rtsn */
++ <3 RK_PA2 1 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ uart2m1_xfer: uart2m1-xfer {
++ rockchip,pins =
++ /* uart2_rx_m1 */
++ <1 RK_PB0 1 &pcfg_pull_up>,
++ /* uart2_tx_m1 */
++ <1 RK_PB1 1 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart2m1_ctsn: uart2m1-ctsn {
++ rockchip,pins =
++ /* uart2m1_ctsn */
++ <1 RK_PB3 1 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ uart2m1_rtsn: uart2m1-rtsn {
++ rockchip,pins =
++ /* uart2m1_rtsn */
++ <1 RK_PB2 1 &pcfg_pull_none>;
++ };
++ };
++
++ uart3 {
++ /omit-if-no-ref/
++ uart3m0_xfer: uart3m0-xfer {
++ rockchip,pins =
++ /* uart3_rx_m0 */
++ <4 RK_PB0 2 &pcfg_pull_up>,
++ /* uart3_tx_m0 */
++ <4 RK_PB1 2 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart3m1_xfer: uart3m1-xfer {
++ rockchip,pins =
++ /* uart3_rx_m1 */
++ <4 RK_PB7 3 &pcfg_pull_up>,
++ /* uart3_tx_m1 */
++ <4 RK_PC0 3 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart3_ctsn: uart3-ctsn {
++ rockchip,pins =
++ /* uart3_ctsn */
++ <4 RK_PA3 3 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ uart3_rtsn: uart3-rtsn {
++ rockchip,pins =
++ /* uart3_rtsn */
++ <4 RK_PA2 3 &pcfg_pull_none>;
++ };
++ };
++
++ uart4 {
++ /omit-if-no-ref/
++ uart4_xfer: uart4-xfer {
++ rockchip,pins =
++ /* uart4_rx */
++ <2 RK_PA2 3 &pcfg_pull_up>,
++ /* uart4_tx */
++ <2 RK_PA3 3 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart4_ctsn: uart4-ctsn {
++ rockchip,pins =
++ /* uart4_ctsn */
++ <2 RK_PA1 3 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ uart4_rtsn: uart4-rtsn {
++ rockchip,pins =
++ /* uart4_rtsn */
++ <2 RK_PA0 3 &pcfg_pull_none>;
++ };
++ };
++
++ uart5 {
++ /omit-if-no-ref/
++ uart5m0_xfer: uart5m0-xfer {
++ rockchip,pins =
++ /* uart5_rx_m0 */
++ <1 RK_PA2 2 &pcfg_pull_up>,
++ /* uart5_tx_m0 */
++ <1 RK_PA3 2 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart5m0_ctsn: uart5m0-ctsn {
++ rockchip,pins =
++ /* uart5m0_ctsn */
++ <1 RK_PA6 2 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ uart5m0_rtsn: uart5m0-rtsn {
++ rockchip,pins =
++ /* uart5m0_rtsn */
++ <1 RK_PA5 2 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ uart5m1_xfer: uart5m1-xfer {
++ rockchip,pins =
++ /* uart5_rx_m1 */
++ <1 RK_PD4 2 &pcfg_pull_up>,
++ /* uart5_tx_m1 */
++ <1 RK_PD7 2 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart5m1_ctsn: uart5m1-ctsn {
++ rockchip,pins =
++ /* uart5m1_ctsn */
++ <1 RK_PD3 2 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ uart5m1_rtsn: uart5m1-rtsn {
++ rockchip,pins =
++ /* uart5m1_rtsn */
++ <1 RK_PD2 2 &pcfg_pull_none>;
++ };
++ };
++
++ uart6 {
++ /omit-if-no-ref/
++ uart6m0_xfer: uart6m0-xfer {
++ rockchip,pins =
++ /* uart6_rx_m0 */
++ <3 RK_PA7 4 &pcfg_pull_up>,
++ /* uart6_tx_m0 */
++ <3 RK_PA6 4 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart6m1_xfer: uart6m1-xfer {
++ rockchip,pins =
++ /* uart6_rx_m1 */
++ <3 RK_PC3 4 &pcfg_pull_up>,
++ /* uart6_tx_m1 */
++ <3 RK_PC1 4 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart6_ctsn: uart6-ctsn {
++ rockchip,pins =
++ /* uart6_ctsn */
++ <3 RK_PA4 4 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ uart6_rtsn: uart6-rtsn {
++ rockchip,pins =
++ /* uart6_rtsn */
++ <3 RK_PA5 4 &pcfg_pull_none>;
++ };
++ };
++
++ uart7 {
++ /omit-if-no-ref/
++ uart7m0_xfer: uart7m0-xfer {
++ rockchip,pins =
++ /* uart7_rx_m0 */
++ <3 RK_PB3 4 &pcfg_pull_up>,
++ /* uart7_tx_m0 */
++ <3 RK_PB2 4 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart7m0_ctsn: uart7m0-ctsn {
++ rockchip,pins =
++ /* uart7m0_ctsn */
++ <3 RK_PB0 4 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ uart7m0_rtsn: uart7m0-rtsn {
++ rockchip,pins =
++ /* uart7m0_rtsn */
++ <3 RK_PB1 4 &pcfg_pull_none>;
++ };
++
++ /omit-if-no-ref/
++ uart7m1_xfer: uart7m1-xfer {
++ rockchip,pins =
++ /* uart7_rx_m1 */
++ <1 RK_PB3 4 &pcfg_pull_up>,
++ /* uart7_tx_m1 */
++ <1 RK_PB2 4 &pcfg_pull_up>;
++ };
++
++ /omit-if-no-ref/
++ uart7m1_ctsn: uart7m1-ctsn {
++ rockchip,pins =
++ /* uart7m1_ctsn */
++ <1 RK_PB0 4 &pcfg_pull_none>;
++ };
++ /omit-if-no-ref/
++ uart7m1_rtsn: uart7m1-rtsn {
++ rockchip,pins =
++ /* uart7m1_rtsn */
++ <1 RK_PB1 4 &pcfg_pull_none>;
++ };
++ };
++};
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -4,8 +4,10 @@
+ * Copyright (c) 2024 Yao Zi <ziyao at disroot.org>
+ */
+
++#include <dt-bindings/gpio/gpio.h>
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/interrupt-controller/irq.h>
++#include <dt-bindings/pinctrl/rockchip.h>
+ #include <dt-bindings/clock/rockchip,rk3528-cru.h>
+
+ / {
+@@ -16,6 +18,11 @@
+ #size-cells = <2>;
+
+ aliases {
++ gpio0 = &gpio0;
++ gpio1 = &gpio1;
++ gpio2 = &gpio2;
++ gpio3 = &gpio3;
++ gpio4 = &gpio4;
+ serial0 = &uart0;
+ serial1 = &uart1;
+ serial2 = &uart2;
+@@ -165,6 +172,11 @@
+ #reset-cells = <1>;
+ };
+
++ ioc_grf: syscon at ff540000 {
++ compatible = "rockchip,rk3528-ioc-grf", "syscon";
++ reg = <0x0 0xff540000 0x0 0x40000>;
++ };
++
+ uart0: serial at ff9f0000 {
+ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+ reg = <0x0 0xff9f0000 0x0 0x100>;
+@@ -251,5 +263,75 @@
+ reg-shift = <2>;
+ status = "disabled";
+ };
++
++ pinctrl: pinctrl {
++ compatible = "rockchip,rk3528-pinctrl";
++ rockchip,grf = <&ioc_grf>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++ ranges;
++
++ gpio0: gpio at ff610000 {
++ compatible = "rockchip,gpio-bank";
++ reg = <0x0 0xff610000 0x0 0x200>;
++ clocks = <&cru PCLK_GPIO0>, <&cru DBCLK_GPIO0>;
++ interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
++ gpio-controller;
++ #gpio-cells = <2>;
++ gpio-ranges = <&pinctrl 0 0 32>;
++ interrupt-controller;
++ #interrupt-cells = <2>;
++ };
++
++ gpio1: gpio at ffaf0000 {
++ compatible = "rockchip,gpio-bank";
++ reg = <0x0 0xffaf0000 0x0 0x200>;
++ clocks = <&cru PCLK_GPIO1>, <&cru DBCLK_GPIO1>;
++ interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
++ gpio-controller;
++ #gpio-cells = <2>;
++ gpio-ranges = <&pinctrl 0 32 32>;
++ interrupt-controller;
++ #interrupt-cells = <2>;
++ };
++
++ gpio2: gpio at ffb00000 {
++ compatible = "rockchip,gpio-bank";
++ reg = <0x0 0xffb00000 0x0 0x200>;
++ clocks = <&cru PCLK_GPIO2>, <&cru DBCLK_GPIO2>;
++ interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
++ gpio-controller;
++ #gpio-cells = <2>;
++ gpio-ranges = <&pinctrl 0 64 32>;
++ interrupt-controller;
++ #interrupt-cells = <2>;
++ };
++
++ gpio3: gpio at ffb10000 {
++ compatible = "rockchip,gpio-bank";
++ reg = <0x0 0xffb10000 0x0 0x200>;
++ clocks = <&cru PCLK_GPIO3>, <&cru DBCLK_GPIO3>;
++ interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
++ gpio-controller;
++ #gpio-cells = <2>;
++ gpio-ranges = <&pinctrl 0 96 32>;
++ interrupt-controller;
++ #interrupt-cells = <2>;
++ };
++
++ gpio4: gpio at ffb20000 {
++ compatible = "rockchip,gpio-bank";
++ reg = <0x0 0xffb20000 0x0 0x200>;
++ clocks = <&cru PCLK_GPIO4>, <&cru DBCLK_GPIO4>;
++ interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
++ gpio-controller;
++ #gpio-cells = <2>;
++ gpio-ranges = <&pinctrl 0 128 32>;
++ interrupt-controller;
++ #interrupt-cells = <2>;
++ };
++ };
+ };
+ };
++
++#include "rk3528-pinctrl.dtsi"
diff --git a/target/linux/rockchip/patches-6.12/070-05-v6.15-arm64-dts-rockchip-Add-rk3528-QoS-register-node.patch b/target/linux/rockchip/patches-6.12/070-05-v6.15-arm64-dts-rockchip-Add-rk3528-QoS-register-node.patch
new file mode 100644
index 0000000000..652a96407e
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-05-v6.15-arm64-dts-rockchip-Add-rk3528-QoS-register-node.patch
@@ -0,0 +1,185 @@
+From 61a05d8ca3030a544175671f5fab7a8f29c24085 Mon Sep 17 00:00:00 2001
+From: Chukun Pan <amadeus at jmu.edu.cn>
+Date: Thu, 6 Mar 2025 20:38:09 +0800
+Subject: [PATCH] arm64: dts: rockchip: Add rk3528 QoS register node
+
+The Quality-of-Service (QsS) node stores/restores specific
+register contents when the power domains is turned off/on.
+Add QoS node so that they can connect to the power domain.
+
+Signed-off-by: Chukun Pan <amadeus at jmu.edu.cn>
+Link: https://lore.kernel.org/r/20250306123809.273655-3-amadeus@jmu.edu.cn
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 160 +++++++++++++++++++++++
+ 1 file changed, 160 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -129,6 +129,166 @@
+ #interrupt-cells = <3>;
+ };
+
++ qos_crypto_a: qos at ff200000 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff200000 0x0 0x20>;
++ };
++
++ qos_crypto_p: qos at ff200080 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff200080 0x0 0x20>;
++ };
++
++ qos_dcf: qos at ff200100 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff200100 0x0 0x20>;
++ };
++
++ qos_dft2apb: qos at ff200200 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff200200 0x0 0x20>;
++ };
++
++ qos_dma2ddr: qos at ff200280 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff200280 0x0 0x20>;
++ };
++
++ qos_dmac: qos at ff200300 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff200300 0x0 0x20>;
++ };
++
++ qos_keyreader: qos at ff200380 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff200380 0x0 0x20>;
++ };
++
++ qos_cpu: qos at ff210000 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff210000 0x0 0x20>;
++ };
++
++ qos_debug: qos at ff210080 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff210080 0x0 0x20>;
++ };
++
++ qos_gpu_m0: qos at ff220000 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff220000 0x0 0x20>;
++ };
++
++ qos_gpu_m1: qos at ff220080 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff220080 0x0 0x20>;
++ };
++
++ qos_pmu_mcu: qos at ff240000 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff240000 0x0 0x20>;
++ };
++
++ qos_rkvdec: qos at ff250000 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff250000 0x0 0x20>;
++ };
++
++ qos_rkvenc: qos at ff260000 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff260000 0x0 0x20>;
++ };
++
++ qos_gmac0: qos at ff270000 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff270000 0x0 0x20>;
++ };
++
++ qos_hdcp: qos at ff270080 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff270080 0x0 0x20>;
++ };
++
++ qos_jpegdec: qos at ff270100 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff270100 0x0 0x20>;
++ };
++
++ qos_rga2_m0ro: qos at ff270200 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff270200 0x0 0x20>;
++ };
++
++ qos_rga2_m0wo: qos at ff270280 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff270280 0x0 0x20>;
++ };
++
++ qos_sdmmc0: qos at ff270300 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff270300 0x0 0x20>;
++ };
++
++ qos_usb2host: qos at ff270380 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff270380 0x0 0x20>;
++ };
++
++ qos_vdpp: qos at ff270480 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff270480 0x0 0x20>;
++ };
++
++ qos_vop: qos at ff270500 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff270500 0x0 0x20>;
++ };
++
++ qos_emmc: qos at ff280000 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff280000 0x0 0x20>;
++ };
++
++ qos_fspi: qos at ff280080 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff280080 0x0 0x20>;
++ };
++
++ qos_gmac1: qos at ff280100 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff280100 0x0 0x20>;
++ };
++
++ qos_pcie: qos at ff280180 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff280180 0x0 0x20>;
++ };
++
++ qos_sdio0: qos at ff280200 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff280200 0x0 0x20>;
++ };
++
++ qos_sdio1: qos at ff280280 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff280280 0x0 0x20>;
++ };
++
++ qos_tsp: qos at ff280300 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff280300 0x0 0x20>;
++ };
++
++ qos_usb3otg: qos at ff280380 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff280380 0x0 0x20>;
++ };
++
++ qos_vpu: qos at ff280400 {
++ compatible = "rockchip,rk3528-qos", "syscon";
++ reg = <0x0 0xff280400 0x0 0x20>;
++ };
++
+ cru: clock-controller at ff4a0000 {
+ compatible = "rockchip,rk3528-cru";
+ reg = <0x0 0xff4a0000 0x0 0x30000>;
diff --git a/target/linux/rockchip/patches-6.12/070-06-v6.15-arm64-dts-rockchip-enable-SCMI-clk-for-RK3528-SoC.patch b/target/linux/rockchip/patches-6.12/070-06-v6.15-arm64-dts-rockchip-enable-SCMI-clk-for-RK3528-SoC.patch
new file mode 100644
index 0000000000..7a138c1269
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-06-v6.15-arm64-dts-rockchip-enable-SCMI-clk-for-RK3528-SoC.patch
@@ -0,0 +1,83 @@
+From fbcbc1fb93e14729bd87ab386b7f62694dcc8b51 Mon Sep 17 00:00:00 2001
+From: Chukun Pan <amadeus at jmu.edu.cn>
+Date: Fri, 7 Mar 2025 18:00:08 +0800
+Subject: [PATCH] arm64: dts: rockchip: enable SCMI clk for RK3528 SoC
+
+Same as RK3568, RK3528 uses SCMI clk instead of ARMCLK.
+Add SCMI clk for CPU, GPU and RNG will also use it.
+
+Signed-off-by: Chukun Pan <amadeus at jmu.edu.cn>
+Link: https://lore.kernel.org/r/20250307100008.789129-2-amadeus@jmu.edu.cn
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 31 ++++++++++++++++++++++++
+ 1 file changed, 31 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -59,6 +59,7 @@
+ reg = <0x0>;
+ device_type = "cpu";
+ enable-method = "psci";
++ clocks = <&scmi_clk SCMI_CLK_CPU>;
+ };
+
+ cpu1: cpu at 1 {
+@@ -66,6 +67,7 @@
+ reg = <0x1>;
+ device_type = "cpu";
+ enable-method = "psci";
++ clocks = <&scmi_clk SCMI_CLK_CPU>;
+ };
+
+ cpu2: cpu at 2 {
+@@ -73,6 +75,7 @@
+ reg = <0x2>;
+ device_type = "cpu";
+ enable-method = "psci";
++ clocks = <&scmi_clk SCMI_CLK_CPU>;
+ };
+
+ cpu3: cpu at 3 {
+@@ -80,6 +83,22 @@
+ reg = <0x3>;
+ device_type = "cpu";
+ enable-method = "psci";
++ clocks = <&scmi_clk SCMI_CLK_CPU>;
++ };
++ };
++
++ firmware {
++ scmi: scmi {
++ compatible = "arm,scmi-smc";
++ arm,smc-id = <0x82000010>;
++ shmem = <&scmi_shmem>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ scmi_clk: protocol at 14 {
++ reg = <0x14>;
++ #clock-cells = <1>;
++ };
+ };
+ };
+
+@@ -88,6 +107,18 @@
+ method = "smc";
+ };
+
++ reserved-memory {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ ranges;
++
++ scmi_shmem: shmem at 10f000 {
++ compatible = "arm,scmi-shmem";
++ reg = <0x0 0x0010f000 0x0 0x100>;
++ no-map;
++ };
++ };
++
+ timer {
+ compatible = "arm,armv8-timer";
+ interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
diff --git a/target/linux/rockchip/patches-6.12/070-07-v6.15-arm64-dts-rockchip-Add-SARADC-node-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-07-v6.15-arm64-dts-rockchip-Add-SARADC-node-for-RK3528.patch
new file mode 100644
index 0000000000..e678c92519
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-07-v6.15-arm64-dts-rockchip-Add-SARADC-node-for-RK3528.patch
@@ -0,0 +1,43 @@
+From 6e58302c84ce90aadbecd41efe1f69098a6f91e5 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Tue, 4 Mar 2025 20:16:36 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add SARADC node for RK3528
+
+Add a device tree node for the SARADC controller used by RK3528.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250304201642.831218-4-jonas@kwiboo.se
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -9,6 +9,7 @@
+ #include <dt-bindings/interrupt-controller/irq.h>
+ #include <dt-bindings/pinctrl/rockchip.h>
+ #include <dt-bindings/clock/rockchip,rk3528-cru.h>
++#include <dt-bindings/reset/rockchip,rk3528-cru.h>
+
+ / {
+ compatible = "rockchip,rk3528";
+@@ -455,6 +456,18 @@
+ status = "disabled";
+ };
+
++ saradc: adc at ffae0000 {
++ compatible = "rockchip,rk3528-saradc";
++ reg = <0x0 0xffae0000 0x0 0x10000>;
++ clocks = <&cru CLK_SARADC>, <&cru PCLK_SARADC>;
++ clock-names = "saradc", "apb_pclk";
++ interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
++ resets = <&cru SRST_P_SARADC>;
++ reset-names = "saradc-apb";
++ #io-channel-cells = <1>;
++ status = "disabled";
++ };
++
+ pinctrl: pinctrl {
+ compatible = "rockchip,rk3528-pinctrl";
+ rockchip,grf = <&ioc_grf>;
diff --git a/target/linux/rockchip/patches-6.12/070-08-v6.15-arm64-dts-rockchip-Add-SDHCI-controller-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-08-v6.15-arm64-dts-rockchip-Add-SDHCI-controller-for-RK3528.patch
new file mode 100644
index 0000000000..dcad4eccc8
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-08-v6.15-arm64-dts-rockchip-Add-SDHCI-controller-for-RK3528.patch
@@ -0,0 +1,50 @@
+From a98cc47f79ab5b8059b748bf0bd59335edfff7d9 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Wed, 5 Mar 2025 21:41:03 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add SDHCI controller for RK3528
+
+The SDHCI controller in Rockchip RK3528 is similar to the one included
+in RK3588.
+
+Add device tree node for the SDHCI controller in RK3528.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250305214108.1327208-3-jonas@kwiboo.se
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -468,6 +468,30 @@
+ status = "disabled";
+ };
+
++ sdhci: mmc at ffbf0000 {
++ compatible = "rockchip,rk3528-dwcmshc",
++ "rockchip,rk3588-dwcmshc";
++ reg = <0x0 0xffbf0000 0x0 0x10000>;
++ assigned-clocks = <&cru BCLK_EMMC>, <&cru TCLK_EMMC>,
++ <&cru CCLK_SRC_EMMC>;
++ assigned-clock-rates = <200000000>, <24000000>,
++ <200000000>;
++ clocks = <&cru CCLK_SRC_EMMC>, <&cru HCLK_EMMC>,
++ <&cru ACLK_EMMC>, <&cru BCLK_EMMC>,
++ <&cru TCLK_EMMC>;
++ clock-names = "core", "bus", "axi", "block", "timer";
++ interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
++ max-frequency = <200000000>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&emmc_bus8>, <&emmc_clk>, <&emmc_cmd>,
++ <&emmc_strb>;
++ resets = <&cru SRST_C_EMMC>, <&cru SRST_H_EMMC>,
++ <&cru SRST_A_EMMC>, <&cru SRST_B_EMMC>,
++ <&cru SRST_T_EMMC>;
++ reset-names = "core", "bus", "axi", "block", "timer";
++ status = "disabled";
++ };
++
+ pinctrl: pinctrl {
+ compatible = "rockchip,rk3528-pinctrl";
+ rockchip,grf = <&ioc_grf>;
diff --git a/target/linux/rockchip/patches-6.12/070-09-v6.16-arm64-dts-rockchip-Add-missing-uart3-interrupt-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-09-v6.16-arm64-dts-rockchip-Add-missing-uart3-interrupt-for-RK3528.patch
new file mode 100644
index 0000000000..36f6f9308c
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-09-v6.16-arm64-dts-rockchip-Add-missing-uart3-interrupt-for-RK3528.patch
@@ -0,0 +1,30 @@
+From a37d21a9b45e47ed6bc1f94e738096c07db78a07 Mon Sep 17 00:00:00 2001
+From: Chukun Pan <amadeus at jmu.edu.cn>
+Date: Tue, 1 Apr 2025 18:00:18 +0800
+Subject: [PATCH] arm64: dts: rockchip: Add missing uart3 interrupt for RK3528
+
+The interrupt of uart3 node on rk3528 is missing, fix it.
+
+Fixes: 7983e6c379a9 ("arm64: dts: rockchip: Add base DT for rk3528 SoC")
+Reviewed-by: Yao Zi <ziyao at disroot.org>
+Signed-off-by: Chukun Pan <amadeus at jmu.edu.cn>
+Link: https://lore.kernel.org/r/20250401100020.944658-2-amadeus@jmu.edu.cn
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -404,9 +404,10 @@
+
+ uart3: serial at ffa08000 {
+ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
++ reg = <0x0 0xffa08000 0x0 0x100>;
+ clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
+ clock-names = "baudclk", "apb_pclk";
+- reg = <0x0 0xffa08000 0x0 0x100>;
++ interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
diff --git a/target/linux/rockchip/patches-6.12/070-10-v6.16-arm64-dts-rockchip-Add-DMA-controller-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-10-v6.16-arm64-dts-rockchip-Add-DMA-controller-for-RK3528.patch
new file mode 100644
index 0000000000..b3a89e4066
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-10-v6.16-arm64-dts-rockchip-Add-DMA-controller-for-RK3528.patch
@@ -0,0 +1,41 @@
+From 762b1f6503340b4729bc8a5fa6a5780712012cd8 Mon Sep 17 00:00:00 2001
+From: Chukun Pan <amadeus at jmu.edu.cn>
+Date: Tue, 1 Apr 2025 18:00:19 +0800
+Subject: [PATCH] arm64: dts: rockchip: Add DMA controller for RK3528
+
+Add DMA controller dt node for RK3528 SoC.
+
+Signed-off-by: Chukun Pan <amadeus at jmu.edu.cn>
+Link: https://lore.kernel.org/r/20250401100020.944658-3-amadeus@jmu.edu.cn
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -493,6 +493,24 @@
+ status = "disabled";
+ };
+
++ dmac: dma-controller at ffd60000 {
++ compatible = "arm,pl330", "arm,primecell";
++ reg = <0x0 0xffd60000 0x0 0x4000>;
++ clocks = <&cru ACLK_DMAC>;
++ clock-names = "apb_pclk";
++ interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
++ #dma-cells = <1>;
++ arm,pl330-periph-burst;
++ };
++
+ pinctrl: pinctrl {
+ compatible = "rockchip,rk3528-pinctrl";
+ rockchip,grf = <&ioc_grf>;
diff --git a/target/linux/rockchip/patches-6.12/070-11-v6.16-arm64-dts-rockchip-Add-UART-DMA-support-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-11-v6.16-arm64-dts-rockchip-Add-UART-DMA-support-for-RK3528.patch
new file mode 100644
index 0000000000..276324651f
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-11-v6.16-arm64-dts-rockchip-Add-UART-DMA-support-for-RK3528.patch
@@ -0,0 +1,81 @@
+From ab6fcb58aedf7df1d146b47d5fedd844a7c346e2 Mon Sep 17 00:00:00 2001
+From: Chukun Pan <amadeus at jmu.edu.cn>
+Date: Tue, 1 Apr 2025 18:00:20 +0800
+Subject: [PATCH] arm64: dts: rockchip: Add UART DMA support for RK3528
+
+The UART ports on RK3528 have DMA capability, describe it.
+Flow control is optional, so dma-names are not added.
+
+Signed-off-by: Chukun Pan <amadeus at jmu.edu.cn>
+Link: https://lore.kernel.org/r/20250401100020.944658-4-amadeus@jmu.edu.cn
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -375,6 +375,7 @@
+ clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
++ dmas = <&dmac 8>, <&dmac 9>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -386,6 +387,7 @@
+ clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
++ dmas = <&dmac 10>, <&dmac 11>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -397,6 +399,7 @@
+ clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
++ dmas = <&dmac 12>, <&dmac 13>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -408,6 +411,7 @@
+ clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
++ dmas = <&dmac 14>, <&dmac 15>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -419,6 +423,7 @@
+ clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
++ dmas = <&dmac 16>, <&dmac 17>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -430,6 +435,7 @@
+ clocks = <&cru SCLK_UART5>, <&cru PCLK_UART5>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
++ dmas = <&dmac 18>, <&dmac 19>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -441,6 +447,7 @@
+ clocks = <&cru SCLK_UART6>, <&cru PCLK_UART6>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
++ dmas = <&dmac 20>, <&dmac 21>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -452,6 +459,7 @@
+ clocks = <&cru SCLK_UART7>, <&cru PCLK_UART7>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
++ dmas = <&dmac 22>, <&dmac 23>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
diff --git a/target/linux/rockchip/patches-6.12/070-12-v6.16-arm64-dts-rockchip-Add-I2C-controllers-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-12-v6.16-arm64-dts-rockchip-Add-I2C-controllers-for-RK3528.patch
new file mode 100644
index 0000000000..0b71b7df90
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-12-v6.16-arm64-dts-rockchip-Add-I2C-controllers-for-RK3528.patch
@@ -0,0 +1,143 @@
+From d3a05f490d048808968df1e0d3240ab01fe82211 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Thu, 17 Apr 2025 12:01:18 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add I2C controllers for RK3528
+
+Describe I2C controllers shipped by RK3528 in devicetree. For I2C-2,
+I2C-4 and I2C-7 which come with only a set of possible pins, a default
+pin configuration is included.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Reviewed-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250417120118.17610-5-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 110 +++++++++++++++++++++++
+ 1 file changed, 110 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -24,6 +24,14 @@
+ gpio2 = &gpio2;
+ gpio3 = &gpio3;
+ gpio4 = &gpio4;
++ i2c0 = &i2c0;
++ i2c1 = &i2c1;
++ i2c2 = &i2c2;
++ i2c3 = &i2c3;
++ i2c4 = &i2c4;
++ i2c5 = &i2c5;
++ i2c6 = &i2c6;
++ i2c7 = &i2c7;
+ serial0 = &uart0;
+ serial1 = &uart1;
+ serial2 = &uart2;
+@@ -465,6 +473,108 @@
+ status = "disabled";
+ };
+
++ i2c0: i2c at ffa50000 {
++ compatible = "rockchip,rk3528-i2c",
++ "rockchip,rk3399-i2c";
++ reg = <0x0 0xffa50000 0x0 0x1000>;
++ clocks = <&cru CLK_I2C0>, <&cru PCLK_I2C0>;
++ clock-names = "i2c", "pclk";
++ interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "disabled";
++ };
++
++ i2c1: i2c at ffa58000 {
++ compatible = "rockchip,rk3528-i2c",
++ "rockchip,rk3399-i2c";
++ reg = <0x0 0xffa58000 0x0 0x1000>;
++ clocks = <&cru CLK_I2C1>, <&cru PCLK_I2C1>;
++ clock-names = "i2c", "pclk";
++ interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "disabled";
++ };
++
++ i2c2: i2c at ffa60000 {
++ compatible = "rockchip,rk3528-i2c",
++ "rockchip,rk3399-i2c";
++ reg = <0x0 0xffa60000 0x0 0x1000>;
++ clocks = <&cru CLK_I2C2>, <&cru PCLK_I2C2>;
++ clock-names = "i2c", "pclk";
++ interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&i2c2m1_xfer>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "disabled";
++ };
++
++ i2c3: i2c at ffa68000 {
++ compatible = "rockchip,rk3528-i2c",
++ "rockchip,rk3399-i2c";
++ reg = <0x0 0xffa68000 0x0 0x1000>;
++ clocks = <&cru CLK_I2C3>, <&cru PCLK_I2C3>;
++ clock-names = "i2c", "pclk";
++ interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "disabled";
++ };
++
++ i2c4: i2c at ffa70000 {
++ compatible = "rockchip,rk3528-i2c",
++ "rockchip,rk3399-i2c";
++ reg = <0x0 0xffa70000 0x0 0x1000>;
++ clocks = <&cru CLK_I2C4>, <&cru PCLK_I2C4>;
++ clock-names = "i2c", "pclk";
++ interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&i2c4_xfer>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "disabled";
++ };
++
++ i2c5: i2c at ffa78000 {
++ compatible = "rockchip,rk3528-i2c",
++ "rockchip,rk3399-i2c";
++ reg = <0x0 0xffa78000 0x0 0x1000>;
++ clocks = <&cru CLK_I2C5>, <&cru PCLK_I2C5>;
++ clock-names = "i2c", "pclk";
++ interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "disabled";
++ };
++
++ i2c6: i2c at ffa80000 {
++ compatible = "rockchip,rk3528-i2c",
++ "rockchip,rk3399-i2c";
++ reg = <0x0 0xffa80000 0x0 0x1000>;
++ clocks = <&cru CLK_I2C6>, <&cru PCLK_I2C6>;
++ clock-names = "i2c", "pclk";
++ interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "disabled";
++ };
++
++ i2c7: i2c at ffa88000 {
++ compatible = "rockchip,rk3528-i2c",
++ "rockchip,rk3399-i2c";
++ reg = <0x0 0xffa88000 0x0 0x1000>;
++ clocks = <&cru CLK_I2C7>, <&cru PCLK_I2C7>;
++ clock-names = "i2c", "pclk";
++ interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&i2c7_xfer>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "disabled";
++ };
++
+ saradc: adc at ffae0000 {
+ compatible = "rockchip,rk3528-saradc";
+ reg = <0x0 0xffae0000 0x0 0x10000>;
diff --git a/target/linux/rockchip/patches-6.12/070-13-v6.16-arm64-dts-rockchip-Add-pwm-nodes-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-13-v6.16-arm64-dts-rockchip-Add-pwm-nodes-for-RK3528.patch
new file mode 100644
index 0000000000..f0b252fa58
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-13-v6.16-arm64-dts-rockchip-Add-pwm-nodes-for-RK3528.patch
@@ -0,0 +1,105 @@
+From 9e701ad7c3551b3ab87ed5fa439569696ddf42e4 Mon Sep 17 00:00:00 2001
+From: Chukun Pan <amadeus at jmu.edu.cn>
+Date: Tue, 1 Apr 2025 20:00:19 +0800
+Subject: [PATCH] arm64: dts: rockchip: Add pwm nodes for RK3528
+
+Add pwm nodes for RK3528. The PWM core on RK3528 is the same as
+RK3328, but the driver does not support interrupts yet.
+
+Signed-off-by: Chukun Pan <amadeus at jmu.edu.cn>
+Reviewed-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250401120020.976343-2-amadeus@jmu.edu.cn
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 80 ++++++++++++++++++++++++
+ 1 file changed, 80 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -575,6 +575,86 @@
+ status = "disabled";
+ };
+
++ pwm0: pwm at ffa90000 {
++ compatible = "rockchip,rk3528-pwm",
++ "rockchip,rk3328-pwm";
++ reg = <0x0 0xffa90000 0x0 0x10>;
++ clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>;
++ clock-names = "pwm", "pclk";
++ #pwm-cells = <3>;
++ status = "disabled";
++ };
++
++ pwm1: pwm at ffa90010 {
++ compatible = "rockchip,rk3528-pwm",
++ "rockchip,rk3328-pwm";
++ reg = <0x0 0xffa90010 0x0 0x10>;
++ clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>;
++ clock-names = "pwm", "pclk";
++ #pwm-cells = <3>;
++ status = "disabled";
++ };
++
++ pwm2: pwm at ffa90020 {
++ compatible = "rockchip,rk3528-pwm",
++ "rockchip,rk3328-pwm";
++ reg = <0x0 0xffa90020 0x0 0x10>;
++ clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>;
++ clock-names = "pwm", "pclk";
++ #pwm-cells = <3>;
++ status = "disabled";
++ };
++
++ pwm3: pwm at ffa90030 {
++ compatible = "rockchip,rk3528-pwm",
++ "rockchip,rk3328-pwm";
++ reg = <0x0 0xffa90030 0x0 0x10>;
++ clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>;
++ clock-names = "pwm", "pclk";
++ #pwm-cells = <3>;
++ status = "disabled";
++ };
++
++ pwm4: pwm at ffa98000 {
++ compatible = "rockchip,rk3528-pwm",
++ "rockchip,rk3328-pwm";
++ reg = <0x0 0xffa98000 0x0 0x10>;
++ clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>;
++ clock-names = "pwm", "pclk";
++ #pwm-cells = <3>;
++ status = "disabled";
++ };
++
++ pwm5: pwm at ffa98010 {
++ compatible = "rockchip,rk3528-pwm",
++ "rockchip,rk3328-pwm";
++ reg = <0x0 0xffa98010 0x0 0x10>;
++ clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>;
++ clock-names = "pwm", "pclk";
++ #pwm-cells = <3>;
++ status = "disabled";
++ };
++
++ pwm6: pwm at ffa98020 {
++ compatible = "rockchip,rk3528-pwm",
++ "rockchip,rk3328-pwm";
++ reg = <0x0 0xffa98020 0x0 0x10>;
++ clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>;
++ clock-names = "pwm", "pclk";
++ #pwm-cells = <3>;
++ status = "disabled";
++ };
++
++ pwm7: pwm at ffa98030 {
++ compatible = "rockchip,rk3528-pwm",
++ "rockchip,rk3328-pwm";
++ reg = <0x0 0xffa98030 0x0 0x10>;
++ clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>;
++ clock-names = "pwm", "pclk";
++ #pwm-cells = <3>;
++ status = "disabled";
++ };
++
+ saradc: adc at ffae0000 {
+ compatible = "rockchip,rk3528-saradc";
+ reg = <0x0 0xffae0000 0x0 0x10000>;
diff --git a/target/linux/rockchip/patches-6.12/070-14-v6.16-arm64-dts-rockchip-Add-SDMMC-SDIO-controllers-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-14-v6.16-arm64-dts-rockchip-Add-SDMMC-SDIO-controllers-for-RK3528.patch
new file mode 100644
index 0000000000..a4ee735acc
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-14-v6.16-arm64-dts-rockchip-Add-SDMMC-SDIO-controllers-for-RK3528.patch
@@ -0,0 +1,103 @@
+From 894a2640422208b1d3e4c238f126220d406e5fb1 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Thu, 8 May 2025 23:48:29 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add SDMMC/SDIO controllers for RK3528
+
+RK3528 features two SDIO controllers and one SD/MMC controller, describe
+them in devicetree. Since their sample and drive clocks are located in
+the VO and VPU GRFs, corresponding syscons are added to make these
+clocks available.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Reviewed-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250508234829.27111-3-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 69 ++++++++++++++++++++++++
+ 1 file changed, 69 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -329,6 +329,16 @@
+ reg = <0x0 0xff280400 0x0 0x20>;
+ };
+
++ vpu_grf: syscon at ff340000 {
++ compatible = "rockchip,rk3528-vpu-grf", "syscon";
++ reg = <0x0 0xff340000 0x0 0x8000>;
++ };
++
++ vo_grf: syscon at ff360000 {
++ compatible = "rockchip,rk3528-vo-grf", "syscon";
++ reg = <0x0 0xff360000 0x0 0x10000>;
++ };
++
+ cru: clock-controller at ff4a0000 {
+ compatible = "rockchip,rk3528-cru";
+ reg = <0x0 0xff4a0000 0x0 0x30000>;
+@@ -691,6 +701,65 @@
+ status = "disabled";
+ };
+
++ sdio0: mmc at ffc10000 {
++ compatible = "rockchip,rk3528-dw-mshc",
++ "rockchip,rk3288-dw-mshc";
++ reg = <0x0 0xffc10000 0x0 0x4000>;
++ clocks = <&cru HCLK_SDIO0>,
++ <&cru CCLK_SRC_SDIO0>,
++ <&cru SCLK_SDIO0_DRV>,
++ <&cru SCLK_SDIO0_SAMPLE>;
++ clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
++ fifo-depth = <0x100>;
++ interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>;
++ max-frequency = <200000000>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&sdio0_bus4>, <&sdio0_clk>, <&sdio0_cmd>;
++ resets = <&cru SRST_H_SDIO0>;
++ reset-names = "reset";
++ status = "disabled";
++ };
++
++ sdio1: mmc at ffc20000 {
++ compatible = "rockchip,rk3528-dw-mshc",
++ "rockchip,rk3288-dw-mshc";
++ reg = <0x0 0xffc20000 0x0 0x4000>;
++ clocks = <&cru HCLK_SDIO1>,
++ <&cru CCLK_SRC_SDIO1>,
++ <&cru SCLK_SDIO1_DRV>,
++ <&cru SCLK_SDIO1_SAMPLE>;
++ clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
++ fifo-depth = <0x100>;
++ interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
++ max-frequency = <200000000>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&sdio1_bus4>, <&sdio1_clk>, <&sdio1_cmd>;
++ resets = <&cru SRST_H_SDIO1>;
++ reset-names = "reset";
++ status = "disabled";
++ };
++
++ sdmmc: mmc at ffc30000 {
++ compatible = "rockchip,rk3528-dw-mshc",
++ "rockchip,rk3288-dw-mshc";
++ reg = <0x0 0xffc30000 0x0 0x4000>;
++ clocks = <&cru HCLK_SDMMC0>,
++ <&cru CCLK_SRC_SDMMC0>,
++ <&cru SCLK_SDMMC_DRV>,
++ <&cru SCLK_SDMMC_SAMPLE>;
++ clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
++ fifo-depth = <0x100>;
++ interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
++ max-frequency = <150000000>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&sdmmc_bus4>, <&sdmmc_clk>, <&sdmmc_cmd>,
++ <&sdmmc_det>;
++ resets = <&cru SRST_H_SDMMC0>;
++ reset-names = "reset";
++ rockchip,default-sample-phase = <90>;
++ status = "disabled";
++ };
++
+ dmac: dma-controller at ffd60000 {
+ compatible = "arm,pl330", "arm,primecell";
+ reg = <0x0 0xffd60000 0x0 0x4000>;
diff --git a/target/linux/rockchip/patches-6.12/070-15-v6.16-arm64-dts-rockchip-Add-GMAC-nodes-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-15-v6.16-arm64-dts-rockchip-Add-GMAC-nodes-for-RK3528.patch
new file mode 100644
index 0000000000..a126a21d5b
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-15-v6.16-arm64-dts-rockchip-Add-GMAC-nodes-for-RK3528.patch
@@ -0,0 +1,132 @@
+From 5eb28f461a1b368a57994cc3b3f2ba3154c00bb8 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Fri, 9 May 2025 20:23:57 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add GMAC nodes for RK3528
+
+Rockchip RK3528 has two Ethernet controllers based on Synopsys DWC
+Ethernet QoS IP.
+
+Add device tree nodes for the two Ethernet controllers in RK3528.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Tested-by: Yao Zi <ziyao at disroot.org>
+Link: https://lore.kernel.org/r/20250509202402.260038-2-jonas@kwiboo.se
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 105 +++++++++++++++++++++++
+ 1 file changed, 105 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -677,6 +677,111 @@
+ status = "disabled";
+ };
+
++ gmac0: ethernet at ffbd0000 {
++ compatible = "rockchip,rk3528-gmac", "snps,dwmac-4.20a";
++ reg = <0x0 0xffbd0000 0x0 0x10000>;
++ clocks = <&cru CLK_GMAC0_SRC>, <&cru CLK_GMAC0_RMII_50M>,
++ <&cru CLK_GMAC0_RX>, <&cru CLK_GMAC0_TX>,
++ <&cru PCLK_MAC_VO>, <&cru ACLK_MAC_VO>;
++ clock-names = "stmmaceth", "clk_mac_ref",
++ "mac_clk_rx", "mac_clk_tx",
++ "pclk_mac", "aclk_mac";
++ interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>;
++ interrupt-names = "macirq", "eth_wake_irq";
++ phy-handle = <&rmii0_phy>;
++ phy-mode = "rmii";
++ resets = <&cru SRST_A_MAC_VO>;
++ reset-names = "stmmaceth";
++ rockchip,grf = <&vo_grf>;
++ snps,axi-config = <&gmac0_stmmac_axi_setup>;
++ snps,mixed-burst;
++ snps,mtl-rx-config = <&gmac0_mtl_rx_setup>;
++ snps,mtl-tx-config = <&gmac0_mtl_tx_setup>;
++ snps,tso;
++ status = "disabled";
++
++ mdio0: mdio {
++ compatible = "snps,dwmac-mdio";
++ #address-cells = <0x1>;
++ #size-cells = <0x0>;
++
++ rmii0_phy: ethernet-phy at 2 {
++ compatible = "ethernet-phy-ieee802.3-c22";
++ reg = <0x2>;
++ clocks = <&cru CLK_MACPHY>;
++ phy-is-integrated;
++ pinctrl-names = "default";
++ pinctrl-0 = <&fephym0_led_link>,
++ <&fephym0_led_spd>;
++ resets = <&cru SRST_MACPHY>;
++ };
++ };
++
++ gmac0_stmmac_axi_setup: stmmac-axi-config {
++ snps,blen = <0 0 0 0 16 8 4>;
++ snps,rd_osr_lmt = <8>;
++ snps,wr_osr_lmt = <4>;
++ };
++
++ gmac0_mtl_rx_setup: rx-queues-config {
++ snps,rx-queues-to-use = <1>;
++ queue0 {};
++ };
++
++ gmac0_mtl_tx_setup: tx-queues-config {
++ snps,tx-queues-to-use = <1>;
++ queue0 {};
++ };
++ };
++
++ gmac1: ethernet at ffbe0000 {
++ compatible = "rockchip,rk3528-gmac", "snps,dwmac-4.20a";
++ reg = <0x0 0xffbe0000 0x0 0x10000>;
++ clocks = <&cru CLK_GMAC1_SRC_VPU>,
++ <&cru CLK_GMAC1_RMII_VPU>,
++ <&cru PCLK_MAC_VPU>,
++ <&cru ACLK_MAC_VPU>;
++ clock-names = "stmmaceth",
++ "clk_mac_ref",
++ "pclk_mac",
++ "aclk_mac";
++ interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>;
++ interrupt-names = "macirq", "eth_wake_irq";
++ resets = <&cru SRST_A_MAC>;
++ reset-names = "stmmaceth";
++ rockchip,grf = <&vpu_grf>;
++ snps,axi-config = <&gmac1_stmmac_axi_setup>;
++ snps,mixed-burst;
++ snps,mtl-rx-config = <&gmac1_mtl_rx_setup>;
++ snps,mtl-tx-config = <&gmac1_mtl_tx_setup>;
++ snps,tso;
++ status = "disabled";
++
++ mdio1: mdio {
++ compatible = "snps,dwmac-mdio";
++ #address-cells = <0x1>;
++ #size-cells = <0x0>;
++ };
++
++ gmac1_stmmac_axi_setup: stmmac-axi-config {
++ snps,blen = <0 0 0 0 16 8 4>;
++ snps,rd_osr_lmt = <8>;
++ snps,wr_osr_lmt = <4>;
++ };
++
++ gmac1_mtl_rx_setup: rx-queues-config {
++ snps,rx-queues-to-use = <1>;
++ queue0 {};
++ };
++
++ gmac1_mtl_tx_setup: tx-queues-config {
++ snps,tx-queues-to-use = <1>;
++ queue0 {};
++ };
++ };
++
+ sdhci: mmc at ffbf0000 {
+ compatible = "rockchip,rk3528-dwcmshc",
+ "rockchip,rk3588-dwcmshc";
diff --git a/target/linux/rockchip/patches-6.12/070-16-v6.16-arm64-dts-rockchip-move-rk3528-pinctrl-node-outside-the.patch b/target/linux/rockchip/patches-6.12/070-16-v6.16-arm64-dts-rockchip-move-rk3528-pinctrl-node-outside-the.patch
new file mode 100644
index 0000000000..496466b549
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-16-v6.16-arm64-dts-rockchip-move-rk3528-pinctrl-node-outside-the.patch
@@ -0,0 +1,171 @@
+From 7d086f78fe09fb94eb3b2e12436f2feed21d9c1e Mon Sep 17 00:00:00 2001
+From: Heiko Stuebner <heiko at sntech.de>
+Date: Mon, 19 May 2025 00:04:46 +0200
+Subject: [PATCH] arm64: dts: rockchip: move rk3528 pinctrl node outside the
+ soc node
+
+The non-mmio pinctrl node is not supposed to be inside the soc simple-bus
+as dtc points out:
+
+../arch/arm64/boot/dts/rockchip/rk3528.dtsi:870.20-936.5: Warning (simple_bus_reg): /soc/pinctrl: missing or empty reg/ranges property
+
+Move the pinctrl node outside and adapt the indentation.
+
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+Link: https://lore.kernel.org/r/20250518220449.2722673-5-heiko@sntech.de
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 136 +++++++++++------------
+ 1 file changed, 68 insertions(+), 68 deletions(-)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -111,6 +111,74 @@
+ };
+ };
+
++ pinctrl: pinctrl {
++ compatible = "rockchip,rk3528-pinctrl";
++ rockchip,grf = <&ioc_grf>;
++ #address-cells = <2>;
++ #size-cells = <2>;
++ ranges;
++
++ gpio0: gpio at ff610000 {
++ compatible = "rockchip,gpio-bank";
++ reg = <0x0 0xff610000 0x0 0x200>;
++ clocks = <&cru PCLK_GPIO0>, <&cru DBCLK_GPIO0>;
++ interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
++ gpio-controller;
++ #gpio-cells = <2>;
++ gpio-ranges = <&pinctrl 0 0 32>;
++ interrupt-controller;
++ #interrupt-cells = <2>;
++ };
++
++ gpio1: gpio at ffaf0000 {
++ compatible = "rockchip,gpio-bank";
++ reg = <0x0 0xffaf0000 0x0 0x200>;
++ clocks = <&cru PCLK_GPIO1>, <&cru DBCLK_GPIO1>;
++ interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
++ gpio-controller;
++ #gpio-cells = <2>;
++ gpio-ranges = <&pinctrl 0 32 32>;
++ interrupt-controller;
++ #interrupt-cells = <2>;
++ };
++
++ gpio2: gpio at ffb00000 {
++ compatible = "rockchip,gpio-bank";
++ reg = <0x0 0xffb00000 0x0 0x200>;
++ clocks = <&cru PCLK_GPIO2>, <&cru DBCLK_GPIO2>;
++ interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
++ gpio-controller;
++ #gpio-cells = <2>;
++ gpio-ranges = <&pinctrl 0 64 32>;
++ interrupt-controller;
++ #interrupt-cells = <2>;
++ };
++
++ gpio3: gpio at ffb10000 {
++ compatible = "rockchip,gpio-bank";
++ reg = <0x0 0xffb10000 0x0 0x200>;
++ clocks = <&cru PCLK_GPIO3>, <&cru DBCLK_GPIO3>;
++ interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
++ gpio-controller;
++ #gpio-cells = <2>;
++ gpio-ranges = <&pinctrl 0 96 32>;
++ interrupt-controller;
++ #interrupt-cells = <2>;
++ };
++
++ gpio4: gpio at ffb20000 {
++ compatible = "rockchip,gpio-bank";
++ reg = <0x0 0xffb20000 0x0 0x200>;
++ clocks = <&cru PCLK_GPIO4>, <&cru DBCLK_GPIO4>;
++ interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
++ gpio-controller;
++ #gpio-cells = <2>;
++ gpio-ranges = <&pinctrl 0 128 32>;
++ interrupt-controller;
++ #interrupt-cells = <2>;
++ };
++ };
++
+ psci {
+ compatible = "arm,psci-1.0", "arm,psci-0.2";
+ method = "smc";
+@@ -882,74 +950,6 @@
+ #dma-cells = <1>;
+ arm,pl330-periph-burst;
+ };
+-
+- pinctrl: pinctrl {
+- compatible = "rockchip,rk3528-pinctrl";
+- rockchip,grf = <&ioc_grf>;
+- #address-cells = <2>;
+- #size-cells = <2>;
+- ranges;
+-
+- gpio0: gpio at ff610000 {
+- compatible = "rockchip,gpio-bank";
+- reg = <0x0 0xff610000 0x0 0x200>;
+- clocks = <&cru PCLK_GPIO0>, <&cru DBCLK_GPIO0>;
+- interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
+- gpio-controller;
+- #gpio-cells = <2>;
+- gpio-ranges = <&pinctrl 0 0 32>;
+- interrupt-controller;
+- #interrupt-cells = <2>;
+- };
+-
+- gpio1: gpio at ffaf0000 {
+- compatible = "rockchip,gpio-bank";
+- reg = <0x0 0xffaf0000 0x0 0x200>;
+- clocks = <&cru PCLK_GPIO1>, <&cru DBCLK_GPIO1>;
+- interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+- gpio-controller;
+- #gpio-cells = <2>;
+- gpio-ranges = <&pinctrl 0 32 32>;
+- interrupt-controller;
+- #interrupt-cells = <2>;
+- };
+-
+- gpio2: gpio at ffb00000 {
+- compatible = "rockchip,gpio-bank";
+- reg = <0x0 0xffb00000 0x0 0x200>;
+- clocks = <&cru PCLK_GPIO2>, <&cru DBCLK_GPIO2>;
+- interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
+- gpio-controller;
+- #gpio-cells = <2>;
+- gpio-ranges = <&pinctrl 0 64 32>;
+- interrupt-controller;
+- #interrupt-cells = <2>;
+- };
+-
+- gpio3: gpio at ffb10000 {
+- compatible = "rockchip,gpio-bank";
+- reg = <0x0 0xffb10000 0x0 0x200>;
+- clocks = <&cru PCLK_GPIO3>, <&cru DBCLK_GPIO3>;
+- interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
+- gpio-controller;
+- #gpio-cells = <2>;
+- gpio-ranges = <&pinctrl 0 96 32>;
+- interrupt-controller;
+- #interrupt-cells = <2>;
+- };
+-
+- gpio4: gpio at ffb20000 {
+- compatible = "rockchip,gpio-bank";
+- reg = <0x0 0xffb20000 0x0 0x200>;
+- clocks = <&cru PCLK_GPIO4>, <&cru DBCLK_GPIO4>;
+- interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
+- gpio-controller;
+- #gpio-cells = <2>;
+- gpio-ranges = <&pinctrl 0 128 32>;
+- interrupt-controller;
+- #interrupt-cells = <2>;
+- };
+- };
+ };
+ };
+
diff --git a/target/linux/rockchip/patches-6.12/070-17-v6.17-arm64-dts-rockchip-Add-spi-nodes-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-17-v6.17-arm64-dts-rockchip-Add-spi-nodes-for-RK3528.patch
new file mode 100644
index 0000000000..49c2de49e9
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-17-v6.17-arm64-dts-rockchip-Add-spi-nodes-for-RK3528.patch
@@ -0,0 +1,51 @@
+From 2783335329e5762deb0dc5b6d634225d8613af16 Mon Sep 17 00:00:00 2001
+From: Chukun Pan <amadeus at jmu.edu.cn>
+Date: Tue, 20 May 2025 18:01:02 +0800
+Subject: [PATCH] arm64: dts: rockchip: Add spi nodes for RK3528
+
+There are 2 SPI controllers on the RK3528 SoC, describe it.
+
+Signed-off-by: Chukun Pan <amadeus at jmu.edu.cn>
+Link: https://lore.kernel.org/r/20250520100102.1226725-3-amadeus@jmu.edu.cn
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 28 ++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -455,6 +455,34 @@
+ reg = <0x0 0xff540000 0x0 0x40000>;
+ };
+
++ spi0: spi at ff9c0000 {
++ compatible = "rockchip,rk3528-spi",
++ "rockchip,rk3066-spi";
++ reg = <0x0 0xff9c0000 0x0 0x1000>;
++ clocks = <&cru CLK_SPI0>, <&cru PCLK_SPI0>;
++ clock-names = "spiclk", "apb_pclk";
++ interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
++ dmas = <&dmac 25>, <&dmac 24>;
++ dma-names = "tx", "rx";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "disabled";
++ };
++
++ spi1: spi at ff9d0000 {
++ compatible = "rockchip,rk3528-spi",
++ "rockchip,rk3066-spi";
++ reg = <0x0 0xff9d0000 0x0 0x1000>;
++ clocks = <&cru CLK_SPI1>, <&cru PCLK_SPI1>;
++ clock-names = "spiclk", "apb_pclk";
++ interrupts = <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>;
++ dmas = <&dmac 31>, <&dmac 30>;
++ dma-names = "tx", "rx";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "disabled";
++ };
++
+ uart0: serial at ff9f0000 {
+ compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+ reg = <0x0 0xff9f0000 0x0 0x100>;
diff --git a/target/linux/rockchip/patches-6.12/070-18-v6.17-arm64-dts-rockchip-Add-power-controller-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-18-v6.17-arm64-dts-rockchip-Add-power-controller-for-RK3528.patch
new file mode 100644
index 0000000000..922d70cc4b
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-18-v6.17-arm64-dts-rockchip-Add-power-controller-for-RK3528.patch
@@ -0,0 +1,94 @@
+From 654df8e74dbc19ba0625051079e6889e6999d16e Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Sun, 18 May 2025 22:06:51 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add power controller for RK3528
+
+Add power-domain nodes for the power controller on RK3528.
+
+Only PD_GPU can fully be powered down. PD_RKVDEC, PD_RKVENC, PD_VO and
+PD_VPU are idle only power domains used by miscellaneous devices.
+
+Because multiple of the miscellaneous device types currently complain
+about the use of a power-domains prop, only PD_GPU is enabled.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250518220707.669515-5-jonas@kwiboo.se
+[changed to using numeric values, until the next merge-window]
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 64 ++++++++++++++++++++++++
+ 1 file changed, 64 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -455,6 +455,70 @@
+ reg = <0x0 0xff540000 0x0 0x40000>;
+ };
+
++ pmu: power-management at ff600000 {
++ compatible = "rockchip,rk3528-pmu", "syscon", "simple-mfd";
++ reg = <0x0 0xff600000 0x0 0x2000>;
++
++ power: power-controller {
++ compatible = "rockchip,rk3528-power-controller";
++ #power-domain-cells = <1>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ /* These power domains are grouped by VD_GPU */
++ power-domain at 4 {
++ reg = <4>;
++ clocks = <&cru ACLK_GPU_MALI>,
++ <&cru PCLK_GPU_ROOT>;
++ pm_qos = <&qos_gpu_m0>,
++ <&qos_gpu_m1>;
++ #power-domain-cells = <0>;
++ };
++
++ /* These power domains are grouped by VD_LOGIC */
++ power-domain at 5 {
++ reg = <5>;
++ pm_qos = <&qos_rkvdec>;
++ #power-domain-cells = <0>;
++ status = "disabled";
++ };
++ power-domain at 6 {
++ reg = <6>;
++ pm_qos = <&qos_rkvenc>;
++ #power-domain-cells = <0>;
++ status = "disabled";
++ };
++ power-domain at 7 {
++ reg = <7>;
++ pm_qos = <&qos_gmac0>,
++ <&qos_hdcp>,
++ <&qos_jpegdec>,
++ <&qos_rga2_m0ro>,
++ <&qos_rga2_m0wo>,
++ <&qos_sdmmc0>,
++ <&qos_usb2host>,
++ <&qos_vdpp>,
++ <&qos_vop>;
++ #power-domain-cells = <0>;
++ status = "disabled";
++ };
++ power-domain at 8 {
++ reg = <8>;
++ pm_qos = <&qos_emmc>,
++ <&qos_fspi>,
++ <&qos_gmac1>,
++ <&qos_pcie>,
++ <&qos_sdio0>,
++ <&qos_sdio1>,
++ <&qos_tsp>,
++ <&qos_usb3otg>,
++ <&qos_vpu>;
++ #power-domain-cells = <0>;
++ status = "disabled";
++ };
++ };
++ };
++
+ spi0: spi at ff9c0000 {
+ compatible = "rockchip,rk3528-spi",
+ "rockchip,rk3066-spi";
diff --git a/target/linux/rockchip/patches-6.12/070-19-v6.17-arm64-dts-rockchip-Add-GPU-node-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-19-v6.17-arm64-dts-rockchip-Add-GPU-node-for-RK3528.patch
new file mode 100644
index 0000000000..492f9d51c5
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-19-v6.17-arm64-dts-rockchip-Add-GPU-node-for-RK3528.patch
@@ -0,0 +1,88 @@
+From 06601cc45b5ba0c3bcd371b9c499d9fe5dabd11d Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Sun, 18 May 2025 22:54:12 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add GPU node for RK3528
+
+Add a GPU node and a opp-table for the Mali-450 MP2 in the RK3528 SoC.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250518225418.682182-3-jonas@kwiboo.se
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 58 ++++++++++++++++++++++++
+ 1 file changed, 58 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -111,6 +111,36 @@
+ };
+ };
+
++ gpu_opp_table: opp-table-gpu {
++ compatible = "operating-points-v2";
++
++ opp-300000000 {
++ opp-hz = /bits/ 64 <300000000>;
++ opp-microvolt = <875000 875000 1000000>;
++ opp-suspend;
++ };
++
++ opp-500000000 {
++ opp-hz = /bits/ 64 <500000000>;
++ opp-microvolt = <875000 875000 1000000>;
++ };
++
++ opp-600000000 {
++ opp-hz = /bits/ 64 <600000000>;
++ opp-microvolt = <875000 875000 1000000>;
++ };
++
++ opp-700000000 {
++ opp-hz = /bits/ 64 <700000000>;
++ opp-microvolt = <900000 900000 1000000>;
++ };
++
++ opp-800000000 {
++ opp-hz = /bits/ 64 <800000000>;
++ opp-microvolt = <950000 950000 1000000>;
++ };
++ };
++
+ pinctrl: pinctrl {
+ compatible = "rockchip,rk3528-pinctrl";
+ rockchip,grf = <&ioc_grf>;
+@@ -519,6 +549,34 @@
+ };
+ };
+
++ gpu: gpu at ff700000 {
++ compatible = "rockchip,rk3528-mali", "arm,mali-450";
++ reg = <0x0 0xff700000 0x0 0x40000>;
++ assigned-clocks = <&cru ACLK_GPU_MALI>,
++ <&scmi_clk SCMI_CLK_GPU>;
++ assigned-clock-rates = <297000000>, <300000000>;
++ clocks = <&cru ACLK_GPU_MALI>, <&scmi_clk SCMI_CLK_GPU>;
++ clock-names = "bus", "core";
++ interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;
++ interrupt-names = "gp",
++ "gpmmu",
++ "pp",
++ "pp0",
++ "ppmmu0",
++ "pp1",
++ "ppmmu1";
++ operating-points-v2 = <&gpu_opp_table>;
++ power-domains = <&power 4>;
++ resets = <&cru SRST_A_GPU>;
++ status = "disabled";
++ };
++
+ spi0: spi at ff9c0000 {
+ compatible = "rockchip,rk3528-spi",
+ "rockchip,rk3066-spi";
diff --git a/target/linux/rockchip/patches-6.12/070-20-v6.17-arm64-dts-rockchip-Fix-pinctrl-node-names-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-20-v6.17-arm64-dts-rockchip-Fix-pinctrl-node-names-for-RK3528.patch
new file mode 100644
index 0000000000..96a1c8bad6
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-20-v6.17-arm64-dts-rockchip-Fix-pinctrl-node-names-for-RK3528.patch
@@ -0,0 +1,125 @@
+From f2792bf1c7a54ef23fb3a84286b66f427bfc4853 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Sat, 21 Jun 2025 11:38:57 +0000
+Subject: [PATCH] arm64: dts: rockchip: Fix pinctrl node names for RK3528
+
+Following warnings can be observed with CHECK_DTBS=y for the RK3528:
+
+ rk3528-pinctrl.dtsi:101.36-105.5: Warning (node_name_chars_strict):
+ /pinctrl/fephy/fephym0-led_dpx: Character '_' not recommended in node name
+ rk3528-pinctrl.dtsi:108.38-112.5: Warning (node_name_chars_strict):
+ /pinctrl/fephy/fephym0-led_link: Character '_' not recommended in node name
+ rk3528-pinctrl.dtsi:115.36-119.5: Warning (node_name_chars_strict):
+ /pinctrl/fephy/fephym0-led_spd: Character '_' not recommended in node name
+ rk3528-pinctrl.dtsi:122.36-126.5: Warning (node_name_chars_strict):
+ /pinctrl/fephy/fephym1-led_dpx: Character '_' not recommended in node name
+ rk3528-pinctrl.dtsi:129.38-133.5: Warning (node_name_chars_strict):
+ /pinctrl/fephy/fephym1-led_link: Character '_' not recommended in node name
+ rk3528-pinctrl.dtsi:136.36-140.5: Warning (node_name_chars_strict):
+ /pinctrl/fephy/fephym1-led_spd: Character '_' not recommended in node name
+ rk3528-pinctrl.dtsi:782.32-790.5: Warning (node_name_chars_strict):
+ /pinctrl/rgmii/rgmii-rx_bus2: Character '_' not recommended in node name
+ rk3528-pinctrl.dtsi:793.32-801.5: Warning (node_name_chars_strict):
+ /pinctrl/rgmii/rgmii-tx_bus2: Character '_' not recommended in node name
+ rk3528-pinctrl.dtsi:804.36-810.5: Warning (node_name_chars_strict):
+ /pinctrl/rgmii/rgmii-rgmii_clk: Character '_' not recommended in node name
+ rk3528-pinctrl.dtsi:813.36-823.5: Warning (node_name_chars_strict):
+ /pinctrl/rgmii/rgmii-rgmii_bus: Character '_' not recommended in node name
+
+Rename the affected nodes to fix these warnings.
+
+Fixes: a31fad19ae39 ("arm64: dts: rockchip: Add pinctrl and gpio nodes for RK3528")
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250621113859.2146400-1-jonas@kwiboo.se
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ .../boot/dts/rockchip/rk3528-pinctrl.dtsi | 20 +++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi
+@@ -98,42 +98,42 @@
+
+ fephy {
+ /omit-if-no-ref/
+- fephym0_led_dpx: fephym0-led_dpx {
++ fephym0_led_dpx: fephym0-led-dpx {
+ rockchip,pins =
+ /* fephy_led_dpx_m0 */
+ <4 RK_PB5 2 &pcfg_pull_none>;
+ };
+
+ /omit-if-no-ref/
+- fephym0_led_link: fephym0-led_link {
++ fephym0_led_link: fephym0-led-link {
+ rockchip,pins =
+ /* fephy_led_link_m0 */
+ <4 RK_PC0 2 &pcfg_pull_none>;
+ };
+
+ /omit-if-no-ref/
+- fephym0_led_spd: fephym0-led_spd {
++ fephym0_led_spd: fephym0-led-spd {
+ rockchip,pins =
+ /* fephy_led_spd_m0 */
+ <4 RK_PB7 2 &pcfg_pull_none>;
+ };
+
+ /omit-if-no-ref/
+- fephym1_led_dpx: fephym1-led_dpx {
++ fephym1_led_dpx: fephym1-led-dpx {
+ rockchip,pins =
+ /* fephy_led_dpx_m1 */
+ <2 RK_PA4 5 &pcfg_pull_none>;
+ };
+
+ /omit-if-no-ref/
+- fephym1_led_link: fephym1-led_link {
++ fephym1_led_link: fephym1-led-link {
+ rockchip,pins =
+ /* fephy_led_link_m1 */
+ <2 RK_PA6 5 &pcfg_pull_none>;
+ };
+
+ /omit-if-no-ref/
+- fephym1_led_spd: fephym1-led_spd {
++ fephym1_led_spd: fephym1-led-spd {
+ rockchip,pins =
+ /* fephy_led_spd_m1 */
+ <2 RK_PA5 5 &pcfg_pull_none>;
+@@ -779,7 +779,7 @@
+ };
+
+ /omit-if-no-ref/
+- rgmii_rx_bus2: rgmii-rx_bus2 {
++ rgmii_rx_bus2: rgmii-rx-bus2 {
+ rockchip,pins =
+ /* rgmii_rxd0 */
+ <3 RK_PA3 2 &pcfg_pull_none>,
+@@ -790,7 +790,7 @@
+ };
+
+ /omit-if-no-ref/
+- rgmii_tx_bus2: rgmii-tx_bus2 {
++ rgmii_tx_bus2: rgmii-tx-bus2 {
+ rockchip,pins =
+ /* rgmii_txd0 */
+ <3 RK_PA1 2 &pcfg_pull_none_drv_level_2>,
+@@ -801,7 +801,7 @@
+ };
+
+ /omit-if-no-ref/
+- rgmii_rgmii_clk: rgmii-rgmii_clk {
++ rgmii_rgmii_clk: rgmii-rgmii-clk {
+ rockchip,pins =
+ /* rgmii_rxclk */
+ <3 RK_PA5 2 &pcfg_pull_none>,
+@@ -810,7 +810,7 @@
+ };
+
+ /omit-if-no-ref/
+- rgmii_rgmii_bus: rgmii-rgmii_bus {
++ rgmii_rgmii_bus: rgmii-rgmii-bus {
+ rockchip,pins =
+ /* rgmii_rxd2 */
+ <3 RK_PA7 2 &pcfg_pull_none>,
diff --git a/target/linux/rockchip/patches-6.12/070-21-v6.17-arm64-dts-rockchip-Fix-UART-DMA-support-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-21-v6.17-arm64-dts-rockchip-Fix-UART-DMA-support-for-RK3528.patch
new file mode 100644
index 0000000000..e7fddb1d37
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-21-v6.17-arm64-dts-rockchip-Fix-UART-DMA-support-for-RK3528.patch
@@ -0,0 +1,106 @@
+From ae019f0bdfbef3e0671e7b954321e92fc24c7e54 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Wed, 9 Jul 2025 21:08:28 +0000
+Subject: [PATCH] arm64: dts: rockchip: Fix UART DMA support for RK3528
+
+Trying to use UART2 DMA for Bluetooth on ArmSoM Sige1 result in tx
+timeout when using dma-names = "tx", "rx" as required by the dt-binding:
+
+ Bluetooth: hci0: command 0x0c03 tx timeout
+ Bluetooth: hci0: BCM: Reset failed (-110)
+
+Change the dmas order to fix UART DMA support on RK3528.
+
+With this fixed Bluetooth can be loaded using DMA on ArmSoM Sige1:
+
+ Bluetooth: hci0: BCM: chip id 159
+ Bluetooth: hci0: BCM: features 0x0f
+ Bluetooth: hci0: BCM4362A2
+ Bluetooth: hci0: BCM4362A2 (000.017.017) build 0000
+ Bluetooth: hci0: BCM4362A2 'brcm/BCM4362A2.hcd' Patch
+ Bluetooth: hci0: BCM: features 0x0f
+ Bluetooth: hci0: BCM43752A2 UART 37.4MHz Ampak AP6398 sLNA iLNA CL1 [Version: 1091.1173]
+ Bluetooth: hci0: BCM4362A2 (000.017.017) build 1173
+
+Fixes: ab6fcb58aedf ("arm64: dts: rockchip: Add UART DMA support for RK3528")
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250709210831.3170458-1-jonas@kwiboo.se
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -611,7 +611,7 @@
+ clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
+- dmas = <&dmac 8>, <&dmac 9>;
++ dmas = <&dmac 9>, <&dmac 8>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -623,7 +623,7 @@
+ clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+- dmas = <&dmac 10>, <&dmac 11>;
++ dmas = <&dmac 11>, <&dmac 10>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -635,7 +635,7 @@
+ clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
+- dmas = <&dmac 12>, <&dmac 13>;
++ dmas = <&dmac 13>, <&dmac 12>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -647,7 +647,7 @@
+ clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
+- dmas = <&dmac 14>, <&dmac 15>;
++ dmas = <&dmac 15>, <&dmac 14>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -659,7 +659,7 @@
+ clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+- dmas = <&dmac 16>, <&dmac 17>;
++ dmas = <&dmac 17>, <&dmac 16>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -671,7 +671,7 @@
+ clocks = <&cru SCLK_UART5>, <&cru PCLK_UART5>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+- dmas = <&dmac 18>, <&dmac 19>;
++ dmas = <&dmac 19>, <&dmac 18>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -683,7 +683,7 @@
+ clocks = <&cru SCLK_UART6>, <&cru PCLK_UART6>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
+- dmas = <&dmac 20>, <&dmac 21>;
++ dmas = <&dmac 21>, <&dmac 20>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -695,7 +695,7 @@
+ clocks = <&cru SCLK_UART7>, <&cru PCLK_UART7>;
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
+- dmas = <&dmac 22>, <&dmac 23>;
++ dmas = <&dmac 23>, <&dmac 22>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
diff --git a/target/linux/rockchip/patches-6.12/070-22-v6.18-arm64-dts-rockchip-convert-rk3528-power-domains-to.patch b/target/linux/rockchip/patches-6.12/070-22-v6.18-arm64-dts-rockchip-convert-rk3528-power-domains-to.patch
new file mode 100644
index 0000000000..743855c3c7
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-22-v6.18-arm64-dts-rockchip-convert-rk3528-power-domains-to.patch
@@ -0,0 +1,85 @@
+From 1bce3444df79910512587a1f18022c396e9430b5 Mon Sep 17 00:00:00 2001
+From: Heiko Stuebner <heiko at sntech.de>
+Date: Fri, 20 Jun 2025 22:17:15 +0200
+Subject: [PATCH] arm64: dts: rockchip: convert rk3528 power-domains to
+ dt-binding constants
+
+Now that the binding head has been merged, convert the power-domain ids
+back to these constants for easier handling.
+
+Reviewed-by: Jonas Karlman <jonas at kwiboo.se>
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+Link: https://lore.kernel.org/r/20250620201715.1572609-1-heiko@sntech.de
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 23 ++++++++++++-----------
+ 1 file changed, 12 insertions(+), 11 deletions(-)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -9,6 +9,7 @@
+ #include <dt-bindings/interrupt-controller/irq.h>
+ #include <dt-bindings/pinctrl/rockchip.h>
+ #include <dt-bindings/clock/rockchip,rk3528-cru.h>
++#include <dt-bindings/power/rockchip,rk3528-power.h>
+ #include <dt-bindings/reset/rockchip,rk3528-cru.h>
+
+ / {
+@@ -496,8 +497,8 @@
+ #size-cells = <0>;
+
+ /* These power domains are grouped by VD_GPU */
+- power-domain at 4 {
+- reg = <4>;
++ power-domain at RK3528_PD_GPU {
++ reg = <RK3528_PD_GPU>;
+ clocks = <&cru ACLK_GPU_MALI>,
+ <&cru PCLK_GPU_ROOT>;
+ pm_qos = <&qos_gpu_m0>,
+@@ -506,20 +507,20 @@
+ };
+
+ /* These power domains are grouped by VD_LOGIC */
+- power-domain at 5 {
+- reg = <5>;
++ power-domain at RK3528_PD_RKVDEC {
++ reg = <RK3528_PD_RKVDEC>;
+ pm_qos = <&qos_rkvdec>;
+ #power-domain-cells = <0>;
+ status = "disabled";
+ };
+- power-domain at 6 {
+- reg = <6>;
++ power-domain at RK3528_PD_RKVENC {
++ reg = <RK3528_PD_RKVENC>;
+ pm_qos = <&qos_rkvenc>;
+ #power-domain-cells = <0>;
+ status = "disabled";
+ };
+- power-domain at 7 {
+- reg = <7>;
++ power-domain at RK3528_PD_VO {
++ reg = <RK3528_PD_VO>;
+ pm_qos = <&qos_gmac0>,
+ <&qos_hdcp>,
+ <&qos_jpegdec>,
+@@ -532,8 +533,8 @@
+ #power-domain-cells = <0>;
+ status = "disabled";
+ };
+- power-domain at 8 {
+- reg = <8>;
++ power-domain at RK3528_PD_VPU {
++ reg = <RK3528_PD_VPU>;
+ pm_qos = <&qos_emmc>,
+ <&qos_fspi>,
+ <&qos_gmac1>,
+@@ -572,7 +573,7 @@
+ "pp1",
+ "ppmmu1";
+ operating-points-v2 = <&gpu_opp_table>;
+- power-domains = <&power 4>;
++ power-domains = <&power RK3528_PD_GPU>;
+ resets = <&cru SRST_A_GPU>;
+ status = "disabled";
+ };
diff --git a/target/linux/rockchip/patches-6.12/070-23-v6.18-arm64-dts-rockchip-Add-naneng-combphy-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-23-v6.18-arm64-dts-rockchip-Add-naneng-combphy-for-RK3528.patch
new file mode 100644
index 0000000000..3214c4838d
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-23-v6.18-arm64-dts-rockchip-Add-naneng-combphy-for-RK3528.patch
@@ -0,0 +1,55 @@
+From 70bb21cbc8c704c664b5d3ea417f3e35376fc229 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Mon, 28 Jul 2025 10:29:48 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add naneng-combphy for RK3528
+
+Rockchip RK3528 ships a naneng-combphy that is shared by PCIe and USB
+3.0 controllers. Describe it and the pipe-phy grf which it depends on.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Link: https://lore.kernel.org/r/20250728102947.38984-8-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -433,6 +433,11 @@
+ reg = <0x0 0xff340000 0x0 0x8000>;
+ };
+
++ pipe_phy_grf: syscon at ff348000 {
++ compatible = "rockchip,rk3528-pipe-phy-grf", "syscon";
++ reg = <0x0 0xff348000 0x0 0x8000>;
++ };
++
+ vo_grf: syscon at ff360000 {
+ compatible = "rockchip,rk3528-vo-grf", "syscon";
+ reg = <0x0 0xff360000 0x0 0x10000>;
+@@ -1101,6 +1106,25 @@
+ #dma-cells = <1>;
+ arm,pl330-periph-burst;
+ };
++
++ combphy: phy at ffdc0000 {
++ compatible = "rockchip,rk3528-naneng-combphy";
++ reg = <0x0 0xffdc0000 0x0 0x10000>;
++ assigned-clocks = <&cru CLK_REF_PCIE_INNER_PHY>;
++ assigned-clock-rates = <100000000>;
++ clocks = <&cru CLK_REF_PCIE_INNER_PHY>,
++ <&cru PCLK_PCIE_PHY>,
++ <&cru PCLK_PIPE_GRF>;
++ clock-names = "ref", "apb", "pipe";
++ power-domains = <&power RK3528_PD_VPU>;
++ resets = <&cru SRST_PCIE_PIPE_PHY>,
++ <&cru SRST_P_PCIE_PHY>;
++ reset-names = "phy", "apb";
++ #phy-cells = <1>;
++ rockchip,pipe-grf = <&vpu_grf>;
++ rockchip,pipe-phy-grf = <&pipe_phy_grf>;
++ status = "disabled";
++ };
+ };
+ };
+
diff --git a/target/linux/rockchip/patches-6.12/070-24-v6.18-arm64-dts-rockchip-Enable-more-power-domains-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-24-v6.18-arm64-dts-rockchip-Enable-more-power-domains-for-RK3528.patch
new file mode 100644
index 0000000000..1cc18f99aa
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-24-v6.18-arm64-dts-rockchip-Enable-more-power-domains-for-RK3528.patch
@@ -0,0 +1,261 @@
+From 178879625f0f10ff708728087d91a5fe79990ce2 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas at kwiboo.se>
+Date: Thu, 21 Aug 2025 21:18:41 +0000
+Subject: [PATCH] arm64: dts: rockchip: Enable more power domains for RK3528
+
+Describe device power-domains and enable the PD_RKVENC, PD_VO and PD_VPU
+power-domains on RK3528.
+
+The PD_RKVDEC is used by RKVDEC and DDRPHY CRU, and is kept disabled to
+prevent a full system reset trying to read the rate of the SCMI_CLK_DDR
+clock.
+
+Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://lore.kernel.org/r/20250821211843.3051349-2-jonas@kwiboo.se
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 30 +++++++++++++++++++++---
+ 1 file changed, 27 insertions(+), 3 deletions(-)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -171,6 +171,7 @@
+ gpio-ranges = <&pinctrl 0 32 32>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
++ power-domains = <&power RK3528_PD_VPU>;
+ };
+
+ gpio2: gpio at ffb00000 {
+@@ -183,6 +184,7 @@
+ gpio-ranges = <&pinctrl 0 64 32>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
++ power-domains = <&power RK3528_PD_VO>;
+ };
+
+ gpio3: gpio at ffb10000 {
+@@ -195,6 +197,7 @@
+ gpio-ranges = <&pinctrl 0 96 32>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
++ power-domains = <&power RK3528_PD_VPU>;
+ };
+
+ gpio4: gpio at ffb20000 {
+@@ -207,6 +210,7 @@
+ gpio-ranges = <&pinctrl 0 128 32>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
++ power-domains = <&power RK3528_PD_RKVENC>;
+ };
+ };
+
+@@ -522,7 +526,6 @@
+ reg = <RK3528_PD_RKVENC>;
+ pm_qos = <&qos_rkvenc>;
+ #power-domain-cells = <0>;
+- status = "disabled";
+ };
+ power-domain at RK3528_PD_VO {
+ reg = <RK3528_PD_VO>;
+@@ -536,7 +539,6 @@
+ <&qos_vdpp>,
+ <&qos_vop>;
+ #power-domain-cells = <0>;
+- status = "disabled";
+ };
+ power-domain at RK3528_PD_VPU {
+ reg = <RK3528_PD_VPU>;
+@@ -550,7 +552,6 @@
+ <&qos_usb3otg>,
+ <&qos_vpu>;
+ #power-domain-cells = <0>;
+- status = "disabled";
+ };
+ };
+ };
+@@ -592,6 +593,7 @@
+ interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
+ dmas = <&dmac 25>, <&dmac 24>;
+ dma-names = "tx", "rx";
++ power-domains = <&power RK3528_PD_RKVENC>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+@@ -606,6 +608,7 @@
+ interrupts = <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>;
+ dmas = <&dmac 31>, <&dmac 30>;
+ dma-names = "tx", "rx";
++ power-domains = <&power RK3528_PD_VPU>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+@@ -630,6 +633,7 @@
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+ dmas = <&dmac 11>, <&dmac 10>;
++ power-domains = <&power RK3528_PD_RKVENC>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -642,6 +646,7 @@
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
+ dmas = <&dmac 13>, <&dmac 12>;
++ power-domains = <&power RK3528_PD_VPU>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -654,6 +659,7 @@
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
+ dmas = <&dmac 15>, <&dmac 14>;
++ power-domains = <&power RK3528_PD_RKVENC>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -666,6 +672,7 @@
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+ dmas = <&dmac 17>, <&dmac 16>;
++ power-domains = <&power RK3528_PD_VO>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -678,6 +685,7 @@
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+ dmas = <&dmac 19>, <&dmac 18>;
++ power-domains = <&power RK3528_PD_VPU>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -690,6 +698,7 @@
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
+ dmas = <&dmac 21>, <&dmac 20>;
++ power-domains = <&power RK3528_PD_VPU>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -702,6 +711,7 @@
+ clock-names = "baudclk", "apb_pclk";
+ interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
+ dmas = <&dmac 23>, <&dmac 22>;
++ power-domains = <&power RK3528_PD_VPU>;
+ reg-io-width = <4>;
+ reg-shift = <2>;
+ status = "disabled";
+@@ -714,6 +724,7 @@
+ clocks = <&cru CLK_I2C0>, <&cru PCLK_I2C0>;
+ clock-names = "i2c", "pclk";
+ interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
++ power-domains = <&power RK3528_PD_RKVENC>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+@@ -726,6 +737,7 @@
+ clocks = <&cru CLK_I2C1>, <&cru PCLK_I2C1>;
+ clock-names = "i2c", "pclk";
+ interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
++ power-domains = <&power RK3528_PD_RKVENC>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+@@ -752,6 +764,7 @@
+ clocks = <&cru CLK_I2C3>, <&cru PCLK_I2C3>;
+ clock-names = "i2c", "pclk";
+ interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
++ power-domains = <&power RK3528_PD_VPU>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+@@ -766,6 +779,7 @@
+ interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c4_xfer>;
++ power-domains = <&power RK3528_PD_VO>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+@@ -778,6 +792,7 @@
+ clocks = <&cru CLK_I2C5>, <&cru PCLK_I2C5>;
+ clock-names = "i2c", "pclk";
+ interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;
++ power-domains = <&power RK3528_PD_VPU>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+@@ -790,6 +805,7 @@
+ clocks = <&cru CLK_I2C6>, <&cru PCLK_I2C6>;
+ clock-names = "i2c", "pclk";
+ interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
++ power-domains = <&power RK3528_PD_VPU>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+@@ -804,6 +820,7 @@
+ interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c7_xfer>;
++ power-domains = <&power RK3528_PD_VO>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+@@ -895,6 +912,7 @@
+ clocks = <&cru CLK_SARADC>, <&cru PCLK_SARADC>;
+ clock-names = "saradc", "apb_pclk";
+ interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
++ power-domains = <&power RK3528_PD_VPU>;
+ resets = <&cru SRST_P_SARADC>;
+ reset-names = "saradc-apb";
+ #io-channel-cells = <1>;
+@@ -915,6 +933,7 @@
+ interrupt-names = "macirq", "eth_wake_irq";
+ phy-handle = <&rmii0_phy>;
+ phy-mode = "rmii";
++ power-domains = <&power RK3528_PD_VO>;
+ resets = <&cru SRST_A_MAC_VO>;
+ reset-names = "stmmaceth";
+ rockchip,grf = <&vo_grf>;
+@@ -973,6 +992,7 @@
+ interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "macirq", "eth_wake_irq";
++ power-domains = <&power RK3528_PD_VPU>;
+ resets = <&cru SRST_A_MAC>;
+ reset-names = "stmmaceth";
+ rockchip,grf = <&vpu_grf>;
+@@ -1023,6 +1043,7 @@
+ pinctrl-names = "default";
+ pinctrl-0 = <&emmc_bus8>, <&emmc_clk>, <&emmc_cmd>,
+ <&emmc_strb>;
++ power-domains = <&power RK3528_PD_VPU>;
+ resets = <&cru SRST_C_EMMC>, <&cru SRST_H_EMMC>,
+ <&cru SRST_A_EMMC>, <&cru SRST_B_EMMC>,
+ <&cru SRST_T_EMMC>;
+@@ -1044,6 +1065,7 @@
+ max-frequency = <200000000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdio0_bus4>, <&sdio0_clk>, <&sdio0_cmd>;
++ power-domains = <&power RK3528_PD_VPU>;
+ resets = <&cru SRST_H_SDIO0>;
+ reset-names = "reset";
+ status = "disabled";
+@@ -1063,6 +1085,7 @@
+ max-frequency = <200000000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdio1_bus4>, <&sdio1_clk>, <&sdio1_cmd>;
++ power-domains = <&power RK3528_PD_VPU>;
+ resets = <&cru SRST_H_SDIO1>;
+ reset-names = "reset";
+ status = "disabled";
+@@ -1083,6 +1106,7 @@
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdmmc_bus4>, <&sdmmc_clk>, <&sdmmc_cmd>,
+ <&sdmmc_det>;
++ power-domains = <&power RK3528_PD_VO>;
+ resets = <&cru SRST_H_SDMMC0>;
+ reset-names = "reset";
+ rockchip,default-sample-phase = <90>;
diff --git a/target/linux/rockchip/patches-6.12/070-25-v6.18-arm64-dts-rockchip-Add-rk3528-CPU-frequency-scaling.patch b/target/linux/rockchip/patches-6.12/070-25-v6.18-arm64-dts-rockchip-Add-rk3528-CPU-frequency-scaling.patch
new file mode 100644
index 0000000000..6fb1c3f567
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-25-v6.18-arm64-dts-rockchip-Add-rk3528-CPU-frequency-scaling.patch
@@ -0,0 +1,98 @@
+From 42bbc32c7e9e974ae4eb830ae1381cb016133e5c Mon Sep 17 00:00:00 2001
+From: Chukun Pan <amadeus at jmu.edu.cn>
+Date: Fri, 1 Aug 2025 16:00:25 +0800
+Subject: [PATCH] arm64: dts: rockchip: Add rk3528 CPU frequency scaling
+ support
+
+By default, the CPUs on RK3528 operates at 1.5GHz. Add CPU frequency and
+voltage mapping to the device tree to enable dynamic scaling via cpufreq.
+
+The OPP values come from downstream kernel[1], using a voltage close to
+the actual frequency. Frequencies below 1.2GHz have been removed due to
+the same voltage.
+
+[1] https://github.com/rockchip-linux/kernel/blob/develop-5.10/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+
+Signed-off-by: Chukun Pan <amadeus at jmu.edu.cn>
+Link: https://lore.kernel.org/r/20250801080025.558935-2-amadeus@jmu.edu.cn
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 39 ++++++++++++++++++++++++
+ 1 file changed, 39 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -70,6 +70,7 @@
+ device_type = "cpu";
+ enable-method = "psci";
+ clocks = <&scmi_clk SCMI_CLK_CPU>;
++ operating-points-v2 = <&cpu_opp_table>;
+ };
+
+ cpu1: cpu at 1 {
+@@ -78,6 +79,7 @@
+ device_type = "cpu";
+ enable-method = "psci";
+ clocks = <&scmi_clk SCMI_CLK_CPU>;
++ operating-points-v2 = <&cpu_opp_table>;
+ };
+
+ cpu2: cpu at 2 {
+@@ -86,6 +88,7 @@
+ device_type = "cpu";
+ enable-method = "psci";
+ clocks = <&scmi_clk SCMI_CLK_CPU>;
++ operating-points-v2 = <&cpu_opp_table>;
+ };
+
+ cpu3: cpu at 3 {
+@@ -94,6 +97,7 @@
+ device_type = "cpu";
+ enable-method = "psci";
+ clocks = <&scmi_clk SCMI_CLK_CPU>;
++ operating-points-v2 = <&cpu_opp_table>;
+ };
+ };
+
+@@ -112,6 +116,41 @@
+ };
+ };
+
++ cpu_opp_table: opp-table-cpu {
++ compatible = "operating-points-v2";
++ opp-shared;
++
++ opp-1200000000 {
++ opp-hz = /bits/ 64 <1200000000>;
++ opp-microvolt = <875000 875000 1100000>;
++ clock-latency-ns = <40000>;
++ };
++
++ opp-1416000000 {
++ opp-hz = /bits/ 64 <1416000000>;
++ opp-microvolt = <925000 925000 1100000>;
++ clock-latency-ns = <40000>;
++ };
++
++ opp-1608000000 {
++ opp-hz = /bits/ 64 <1608000000>;
++ opp-microvolt = <975000 975000 1100000>;
++ clock-latency-ns = <40000>;
++ };
++
++ opp-1800000000 {
++ opp-hz = /bits/ 64 <1800000000>;
++ opp-microvolt = <1037500 1037500 1100000>;
++ clock-latency-ns = <40000>;
++ };
++
++ opp-2016000000 {
++ opp-hz = /bits/ 64 <2016000000>;
++ opp-microvolt = <1100000 1100000 1100000>;
++ clock-latency-ns = <40000>;
++ };
++ };
++
+ gpu_opp_table: opp-table-gpu {
+ compatible = "operating-points-v2";
+
diff --git a/target/linux/rockchip/patches-6.12/070-26-v6.18-arm64-dts-rockchip-Add-PCIe-Gen2x1-controller-for-RK3528.patch b/target/linux/rockchip/patches-6.12/070-26-v6.18-arm64-dts-rockchip-Add-PCIe-Gen2x1-controller-for-RK3528.patch
new file mode 100644
index 0000000000..b3ba0607b4
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/070-26-v6.18-arm64-dts-rockchip-Add-PCIe-Gen2x1-controller-for-RK3528.patch
@@ -0,0 +1,92 @@
+From 263fac6b09b42a1b077c21354370d38758237ab0 Mon Sep 17 00:00:00 2001
+From: Yao Zi <ziyao at disroot.org>
+Date: Thu, 18 Sep 2025 15:30:56 +0000
+Subject: [PATCH] arm64: dts: rockchip: Add PCIe Gen2x1 controller for RK3528
+
+Describes the PCIe Gen2x1 controller integrated in RK3528 SoC. The SoC
+doesn't provide a separate MSI controller, thus the one integrated in
+designware PCIe IP must be used.
+
+Signed-off-by: Yao Zi <ziyao at disroot.org>
+Reviewed-by: Jonas Karlman <jonas at kwiboo.se>
+Link: https://patch.msgid.link/20250918153057.56023-3-ziyao@disroot.org
+Signed-off-by: Heiko Stuebner <heiko at sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 56 +++++++++++++++++++++++++++++++-
+ 1 file changed, 55 insertions(+), 1 deletion(-)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi
+@@ -7,6 +7,7 @@
+ #include <dt-bindings/gpio/gpio.h>
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/interrupt-controller/irq.h>
++#include <dt-bindings/phy/phy.h>
+ #include <dt-bindings/pinctrl/rockchip.h>
+ #include <dt-bindings/clock/rockchip,rk3528-cru.h>
+ #include <dt-bindings/power/rockchip,rk3528-power.h>
+@@ -294,10 +295,63 @@
+
+ soc {
+ compatible = "simple-bus";
+- ranges = <0x0 0xfe000000 0x0 0xfe000000 0x0 0x2000000>;
++ ranges = <0x0 0xfc000000 0x0 0xfc000000 0x0 0x44000000>;
+ #address-cells = <2>;
+ #size-cells = <2>;
+
++ pcie: pcie at fe000000 {
++ compatible = "rockchip,rk3528-pcie",
++ "rockchip,rk3568-pcie";
++ reg = <0x0 0xfe000000 0x0 0x400000>,
++ <0x0 0xfe4f0000 0x0 0x010000>,
++ <0x0 0xfc000000 0x0 0x100000>;
++ reg-names = "dbi", "apb", "config";
++ bus-range = <0x0 0xff>;
++ clocks = <&cru ACLK_PCIE>, <&cru HCLK_PCIE_SLV>,
++ <&cru HCLK_PCIE_DBI>, <&cru PCLK_PCIE>,
++ <&cru CLK_PCIE_AUX>;
++ clock-names = "aclk_mst", "aclk_slv",
++ "aclk_dbi", "pclk",
++ "aux";
++ device_type = "pci";
++ interrupts = <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 155 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>;
++ interrupt-names = "sys", "pmc", "msg", "legacy", "err",
++ "msi";
++ #interrupt-cells = <1>;
++ interrupt-map-mask = <0 0 0 7>;
++ interrupt-map = <0 0 0 1 &pcie_intc 0>,
++ <0 0 0 2 &pcie_intc 1>,
++ <0 0 0 3 &pcie_intc 2>,
++ <0 0 0 4 &pcie_intc 3>;
++ linux,pci-domain = <0>;
++ max-link-speed = <2>;
++ num-lanes = <1>;
++ phys = <&combphy PHY_TYPE_PCIE>;
++ phy-names = "pcie-phy";
++ power-domains = <&power RK3528_PD_VPU>;
++ ranges = <0x01000000 0x0 0xfc100000 0x0 0xfc100000 0x0 0x00100000>,
++ <0x02000000 0x0 0xfc200000 0x0 0xfc200000 0x0 0x01e00000>,
++ <0x03000000 0x1 0x00000000 0x1 0x00000000 0x0 0x40000000>;
++ resets = <&cru SRST_PCIE_POWER_UP>, <&cru SRST_P_PCIE>;
++ reset-names = "pwr", "pipe";
++ #address-cells = <3>;
++ #size-cells = <2>;
++ status = "disabled";
++
++ pcie_intc: legacy-interrupt-controller {
++ interrupt-controller;
++ interrupt-parent = <&gic>;
++ interrupts = <GIC_SPI 155 IRQ_TYPE_EDGE_RISING>;
++ #address-cells = <0>;
++ #interrupt-cells = <1>;
++ };
++ };
++
+ gic: interrupt-controller at fed01000 {
+ compatible = "arm,gic-400";
+ reg = <0x0 0xfed01000 0 0x1000>,
More information about the lede-commits
mailing list