[PATCH v3 4/6] ARM: dts: rockchip: Add support for RV1106 and RV1103

Jonas Karlman jonas at kwiboo.se
Thu Aug 13 15:06:39 PDT 2026


Hi Simon,

On 7/29/2026 3:35 PM, Simon Glass wrote:
> Add the devicetree files for the Rockchip RV1106, a Cortex-A7 SoC
> aimed at IP cameras, and its RV1103 package variant, which has fewer
> pins and no GPIO2 bank. The pinctrl data comes from the vendor kernel in
> the Luckfox Pico  SDK [1] at commit 824b817f8 (a Linux 5.10.160 kernel
> tree).
> 
> [1] https://github.com/LuckfoxTECH/luckfox-pico
> 
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> 
> Changes in v3:
> - Use the per-bank IOC compatibles
> 
> Changes in v2:
> - Take the MMC drive and sample phase clocks from the CRU and drop the
>   grf-cru node
> - Give each GPIO bank a syscon for its own IOC block, referenced by a
>   rockchip,grf phandle in the bank node
> - Add gpio aliases, which the pin controller and gpio drivers use to
>   identify the bank; the rv1103 removes the gpio2 alias
> 
>  arch/arm/boot/dts/rockchip/rv1103.dtsi        |   16 +
>  .../arm/boot/dts/rockchip/rv1106-pinctrl.dtsi | 1398 +++++++++++++++++
>  arch/arm/boot/dts/rockchip/rv1106.dtsi        |  321 ++++
>  3 files changed, 1735 insertions(+)
>  create mode 100644 arch/arm/boot/dts/rockchip/rv1103.dtsi
>  create mode 100644 arch/arm/boot/dts/rockchip/rv1106-pinctrl.dtsi
>  create mode 100644 arch/arm/boot/dts/rockchip/rv1106.dtsi
> 
> diff --git a/arch/arm/boot/dts/rockchip/rv1103.dtsi b/arch/arm/boot/dts/rockchip/rv1103.dtsi
> new file mode 100644
> index 000000000000..025fde5bf09c
> --- /dev/null
> +++ b/arch/arm/boot/dts/rockchip/rv1103.dtsi
> @@ -0,0 +1,16 @@
> +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> +/*
> + * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
> + */
> +
> +#include "rv1106.dtsi"
> +
> +/ {
> +	compatible = "rockchip,rv1103";
> +
> +	aliases {
> +		/delete-property/ gpio2;
> +	};
> +};
> +
> +/delete-node/ &gpio2;

[snip]

> diff --git a/arch/arm/boot/dts/rockchip/rv1106.dtsi b/arch/arm/boot/dts/rockchip/rv1106.dtsi
> new file mode 100644
> index 000000000000..70d3da6bd03e
> --- /dev/null
> +++ b/arch/arm/boot/dts/rockchip/rv1106.dtsi
> @@ -0,0 +1,321 @@
> +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> +/*
> + * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
> + */
> +
> +#include <dt-bindings/clock/rockchip,rv1106-cru.h>
> +#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>
> +
> +/ {
> +	#address-cells = <1>;
> +	#size-cells = <1>;
> +
> +	compatible = "rockchip,rv1106";
> +
> +	interrupt-parent = <&gic>;
> +
> +	aliases {
> +		gpio0 = &gpio0;
> +		gpio1 = &gpio1;
> +		gpio2 = &gpio2;
> +		gpio3 = &gpio3;
> +		gpio4 = &gpio4;
> +	};
> +
> +	cpus {
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +
> +		cpu0: cpu at f00 {
> +			device_type = "cpu";
> +			compatible = "arm,cortex-a7";
> +			reg = <0xf00>;
> +			clocks = <&cru ARMCLK>;
> +		};
> +	};
> +
> +	arm-pmu {
> +		compatible = "arm,cortex-a7-pmu";
> +		interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>;
> +		interrupt-affinity = <&cpu0>;
> +	};
> +
> +	timer {
> +		compatible = "arm,armv7-timer";
> +		clock-frequency = <24000000>;
> +		interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_HIGH)>,
> +			     <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_HIGH)>;
> +	};
> +
> +	xin24m: oscillator {
> +		compatible = "fixed-clock";
> +		clock-frequency = <24000000>;
> +		clock-output-names = "xin24m";
> +		#clock-cells = <0>;
> +	};
> +
> +	pinctrl: pinctrl {
> +		compatible = "rockchip,rv1106-pinctrl";
> +		rockchip,grf = <&gpio1_ioc>;
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +		ranges;
> +
> +		gpio0: gpio at ff380000 {
> +			compatible = "rockchip,gpio-bank";
> +			reg = <0xff380000 0x100>;
> +			interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru PCLK_PMU_GPIO0>, <&cru DBCLK_PMU_GPIO0>;
> +			gpio-controller;
> +			#gpio-cells = <2>;
> +			gpio-ranges = <&pinctrl 0 0 32>;

This is incorrect hw description, only pins A0-A6 are used from gpio0.

> +			interrupt-controller;
> +			#interrupt-cells = <2>;
> +			rockchip,grf = <&gpio0_ioc>;
> +		};
> +
> +		gpio1: gpio at ff530000 {
> +			compatible = "rockchip,gpio-bank";
> +			reg = <0xff530000 0x100>;
> +			interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru PCLK_GPIO1>, <&cru DBCLK_GPIO1>;
> +			gpio-controller;
> +			#gpio-cells = <2>;
> +			gpio-ranges = <&pinctrl 0 32 32>;

Same here, only  pins A0-A4, B0-B3, C0-C7 and D0-D3 are used from gpio1.

> +			interrupt-controller;
> +			#interrupt-cells = <2>;
> +			rockchip,grf = <&gpio1_ioc>;
> +		};
> +
> +		gpio2: gpio at ff540000 {
> +			compatible = "rockchip,gpio-bank";
> +			reg = <0xff540000 0x100>;
> +			interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru PCLK_GPIO2>, <&cru DBCLK_GPIO2>;
> +			gpio-controller;
> +			#gpio-cells = <2>;
> +			gpio-ranges = <&pinctrl 0 64 32>;

And here, only pins A0-A7 and B0-B1 are used from gpio2.

> +			interrupt-controller;
> +			#interrupt-cells = <2>;
> +			rockchip,grf = <&gpio2_ioc>;
> +		};
> +
> +		gpio3: gpio at ff550000 {
> +			compatible = "rockchip,gpio-bank";
> +			reg = <0xff550000 0x100>;
> +			interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru PCLK_GPIO3>, <&cru DBCLK_GPIO3>;
> +			gpio-controller;
> +			#gpio-cells = <2>;
> +			gpio-ranges = <&pinctrl 0 96 32>;

And here, only pins A1-A7, B0-B7, C0-C7 and D0-D3 from gpio3.

> +			interrupt-controller;
> +			#interrupt-cells = <2>;
> +			rockchip,grf = <&gpio3_ioc>;
> +		};
> +
> +		gpio4: gpio at ff560000 {
> +			compatible = "rockchip,gpio-bank";
> +			reg = <0xff560000 0x100>;
> +			interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru PCLK_GPIO4>, <&cru DBCLK_GPIO4>;
> +			gpio-controller;
> +			#gpio-cells = <2>;
> +			gpio-ranges = <&pinctrl 0 128 32>;

And here, only pins A1-A7, B0-B1 and C0-C1 from gpio4.

> +			interrupt-controller;
> +			#interrupt-cells = <2>;
> +			rockchip,grf = <&gpio4_ioc>;
> +		};
> +	};
> +
> +	soc {
> +		compatible = "simple-bus";
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +		ranges;
> +
> +		grf: syscon at ff000000 {
> +			compatible = "rockchip,rv1106-grf", "syscon";
> +			reg = <0xff000000 0x68000>;

If we decide to describe all GRFs as a single block, maybe add a comment
with names and base address of each individual GRF being grouped here?

  PERI_GRF	0xFF000000 
  VENC_GRF	0xFF010000 
  NPU_GRF	0xFF018000 
  PMU_GRF	0xFF020000 
  DDR_GRF	0xFF030000 
  CORE_GRF	0xFF040000 
  VI_GRF 	0xFF050000 
  VO_GRF	0xFF060000

> +		};
> +
> +		gic: interrupt-controller at ff1f0000 {
> +			compatible = "arm,gic-400";
> +			reg = <0xff1f1000 0x1000>,
> +			      <0xff1f2000 0x2000>,
> +			      <0xff1f4000 0x2000>,
> +			      <0xff1f6000 0x2000>;
> +			interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_HIGH)>;
> +			interrupt-controller;
> +			#interrupt-cells = <3>;
> +			#address-cells = <0>;
> +		};
> +
> +		gpio0_ioc: syscon at ff388000 {
> +			compatible = "rockchip,rv1106-gpio0-ioc", "syscon";
> +			reg = <0xff388000 0x8000>;
> +		};
> +
> +		cru: clock-controller at ff3a0000 {
> +			compatible = "rockchip,rv1106-cru";
> +			reg = <0xff3a0000 0x20000>;
> +			clocks = <&xin24m>;
> +			clock-names = "xin24m";
> +			rockchip,grf = <&grf>;
> +			#clock-cells = <1>;
> +			#reset-cells = <1>;
> +		};
> +
> +		saradc: adc at ff3c0000 {
> +			compatible = "rockchip,rv1106-saradc", "rockchip,rk3588-saradc";
> +			reg = <0xff3c0000 0x100>;
> +			interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru CLK_SARADC>, <&cru PCLK_SARADC>;
> +			clock-names = "saradc", "apb_pclk";

Should probably add default pinctrl here.

> +			#io-channel-cells = <1>;
> +			status = "disabled";
> +		};
> +
> +		uart0: serial at ff4a0000 {
> +			compatible = "rockchip,rv1106-uart", "snps,dw-apb-uart";
> +			reg = <0xff4a0000 0x100>;
> +			interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
> +			reg-shift = <2>;
> +			reg-io-width = <4>;
> +			clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
> +			clock-names = "baudclk", "apb_pclk";
> +			status = "disabled";
> +		};
> +
> +		uart1: serial at ff4b0000 {
> +			compatible = "rockchip,rv1106-uart", "snps,dw-apb-uart";
> +			reg = <0xff4b0000 0x100>;
> +			interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
> +			reg-shift = <2>;
> +			reg-io-width = <4>;
> +			clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>;
> +			clock-names = "baudclk", "apb_pclk";
> +			status = "disabled";
> +		};
> +
> +		uart2: serial at ff4c0000 {
> +			compatible = "rockchip,rv1106-uart", "snps,dw-apb-uart";
> +			reg = <0xff4c0000 0x100>;
> +			interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
> +			reg-shift = <2>;
> +			reg-io-width = <4>;
> +			clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
> +			clock-names = "baudclk", "apb_pclk";
> +			status = "disabled";
> +		};
> +
> +		uart3: serial at ff4d0000 {
> +			compatible = "rockchip,rv1106-uart", "snps,dw-apb-uart";
> +			reg = <0xff4d0000 0x100>;
> +			interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
> +			reg-shift = <2>;
> +			reg-io-width = <4>;
> +			clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
> +			clock-names = "baudclk", "apb_pclk";
> +			status = "disabled";
> +		};
> +
> +		uart4: serial at ff4e0000 {
> +			compatible = "rockchip,rv1106-uart", "snps,dw-apb-uart";
> +			reg = <0xff4e0000 0x100>;
> +			interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
> +			reg-shift = <2>;
> +			reg-io-width = <4>;
> +			clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>;
> +			clock-names = "baudclk", "apb_pclk";
> +			status = "disabled";
> +		};
> +
> +		uart5: serial at ff4f0000 {
> +			compatible = "rockchip,rv1106-uart", "snps,dw-apb-uart";
> +			reg = <0xff4f0000 0x100>;
> +			interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
> +			reg-shift = <2>;
> +			reg-io-width = <4>;
> +			clocks = <&cru SCLK_UART5>, <&cru PCLK_UART5>;
> +			clock-names = "baudclk", "apb_pclk";
> +			status = "disabled";
> +		};
> +
> +		gpio1_ioc: syscon at ff538000 {
> +			compatible = "rockchip,rv1106-gpio1-ioc", "syscon";
> +			reg = <0xff538000 0x8000>;
> +		};
> +
> +		gpio2_ioc: syscon at ff548000 {
> +			compatible = "rockchip,rv1106-gpio2-ioc", "syscon";
> +			reg = <0xff548000 0x8000>;
> +		};
> +
> +		gpio3_ioc: syscon at ff558000 {
> +			compatible = "rockchip,rv1106-gpio3-ioc", "syscon";
> +			reg = <0xff558000 0x8000>;
> +		};
> +
> +		gpio4_ioc: syscon at ff568000 {
> +			compatible = "rockchip,rv1106-gpio4-ioc", "syscon";
> +			reg = <0xff568000 0x8000>;
> +		};
> +
> +		wdt: watchdog at ff5a0000 {
> +			compatible = "rockchip,rv1106-wdt", "snps,dw-wdt";
> +			reg = <0xff5a0000 0x100>;
> +			interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru TCLK_WDT_NS>, <&cru PCLK_WDT_NS>;
> +			clock-names = "tclk", "pclk";
> +			status = "disabled";
> +		};
> +
> +		system_sram: sram at ff6c0000 {
> +			compatible = "mmio-sram";
> +			reg = <0xff6c0000 0x40000>;
> +			#address-cells = <1>;
> +			#size-cells = <1>;
> +			ranges = <0 0xff6c0000 0x40000>;
> +		};
> +
> +		emmc: mmc at ffa90000 {
> +			compatible = "rockchip,rv1106-dw-mshc", "rockchip,rk3288-dw-mshc";
> +			reg = <0xffa90000 0x4000>;
> +			interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru HCLK_EMMC>, <&cru CCLK_SRC_EMMC>,
> +				 <&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>;
> +			clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
> +			fifo-depth = <0x100>;
> +			max-frequency = <200000000>;

Suggest you add default pinctrl here.

> +			status = "disabled";
> +		};
> +
> +		sdmmc: mmc at ffaa0000 {
> +			compatible = "rockchip,rv1106-dw-mshc", "rockchip,rk3288-dw-mshc";
> +			reg = <0xffaa0000 0x4000>;
> +			interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru HCLK_SDMMC>, <&cru CCLK_SRC_SDMMC>,
> +				 <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
> +			clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
> +			fifo-depth = <0x100>;
> +			max-frequency = <200000000>;

Same here.

> +			status = "disabled";
> +		};
> +
> +		sfc: spi at ffac0000 {
> +			compatible = "rockchip,sfc";
> +			reg = <0xffac0000 0x4000>;
> +			interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru SCLK_SFC>, <&cru HCLK_SFC>;
> +			clock-names = "clk_sfc", "hclk_sfc";

And here.

Regards,
Jonas

> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +			status = "disabled";
> +		};
> +	};
> +};
> +
> +#include "rv1106-pinctrl.dtsi"




More information about the linux-arm-kernel mailing list