Skip to content

Commit 5adc521

Browse files
committed
sunxi a523: add support for PCIe, SPI Flash and Iommu
1 parent 170ebf2 commit 5adc521

21 files changed

+10368
-3
lines changed

config/kernel/linux-sunxi64-edge.config

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,7 @@ CONFIG_PCI=y
579579
CONFIG_PCIEPORTBUS=y
580580
CONFIG_PCI_HOST_GENERIC=y
581581
CONFIG_PCIE_DW_PLAT_HOST=y
582+
CONFIG_PCIE_SUN55I_RC=y
582583
CONFIG_UEVENT_HELPER=y
583584
CONFIG_DEVTMPFS=y
584585
CONFIG_DEVTMPFS_MOUNT=y
@@ -603,7 +604,7 @@ CONFIG_MTD_CMDLINE_PARTS=m
603604
CONFIG_MTD_BLOCK=y
604605
CONFIG_MTD_OOPS=m
605606
CONFIG_MTD_PARTITIONED_MASTER=y
606-
CONFIG_MTD_SPI_NOR=m
607+
CONFIG_MTD_SPI_NOR=y
607608
CONFIG_OF_OVERLAY=y
608609
CONFIG_BLK_DEV_PCIESSD_MTIP32XX=m
609610
CONFIG_ZRAM=m
@@ -1137,11 +1138,13 @@ CONFIG_I2C_SLAVE_EEPROM=m
11371138
CONFIG_I3C=m
11381139
CONFIG_DW_I3C_MASTER=m
11391140
CONFIG_SPI=y
1141+
CONFIG_SPI_DEBUG=y
11401142
CONFIG_SPI_DESIGNWARE=m
11411143
CONFIG_SPI_DW_DMA=y
11421144
CONFIG_SPI_DW_PCI=m
11431145
CONFIG_SPI_DW_MMIO=m
1144-
CONFIG_SPI_GPIO=m
1146+
CONFIG_SPI_GPIO=y
1147+
CONFIG_SPI_PL022=y
11451148
CONFIG_SPI_SUN4I=y
11461149
CONFIG_SPI_SUN6I=y
11471150
CONFIG_SPI_MUX=m
@@ -2223,6 +2226,7 @@ CONFIG_ARM_SMMU_V3=m
22232226
CONFIG_ARM_SMMU_V3_SVA=y
22242227
CONFIG_IOMMUFD=m
22252228
CONFIG_SUN50I_IOMMU=y
2229+
CONFIG_SUN55I_IOMMU=y
22262230
CONFIG_REMOTEPROC=y
22272231
CONFIG_REMOTEPROC_CDEV=y
22282232
CONFIG_SUN50I_H6_PRCM_PPU=m
@@ -2644,6 +2648,7 @@ CONFIG_PHY_CAN_TRANSCEIVER=m
26442648
CONFIG_PHY_SUN4I_USB=y
26452649
CONFIG_PHY_SUN9I_USB=y
26462650
CONFIG_PHY_SUN50I_USB3=y
2651+
CONFIG_AW_INNO_COMBOPHY=y
26472652
CONFIG_ARM_CCI_PMU=y
26482653
# CONFIG_ARM_CCI400_PMU is not set
26492654
# CONFIG_ARM_CCI5xx_PMU is not set
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Marvin Wewer <mwewer37@proton.me>
3+
Date: Sun, 11 Jan 2026 12:11:10 +0000
4+
Subject: arm64: dts: allwinner: a527-cubie-a5e: enable PCIe/USB-C combophy
5+
6+
Signed-off-by: Marvin Wewer <mwewer37@proton.me>
7+
---
8+
---
9+
arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts | 58 ++++++++++
10+
1 file changed, 58 insertions(+)
11+
12+
diff --git a/arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts b/arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts
13+
index 111111111111..222222222222 100644
14+
--- a/arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts
15+
+++ b/arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts
16+
@@ -76,6 +76,39 @@ reg_usb_vbus: vbus {
17+
gpio = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
18+
enable-active-high;
19+
};
20+
+
21+
+ reg_pcie_vcc3v3: regulator-pcie-vcc3v3 {
22+
+ compatible = "regulator-fixed";
23+
+ regulator-name = "pcie-3v3";
24+
+ regulator-min-microvolt = <3300000>;
25+
+ regulator-max-microvolt = <3300000>;
26+
+ regulator-enable-ramp-delay = <1000>;
27+
+ regulator-always-on;
28+
+ regulator-boot-on;
29+
+ gpio = <&r_pio 0 11 GPIO_ACTIVE_HIGH>;
30+
+ enable-active-high;
31+
+ };
32+
+
33+
+ gma340_oe: gma340-oe {
34+
+ compatible = "regulator-fixed";
35+
+ regulator-name = "gma340-oe";
36+
+ regulator-min-microvolt = <3300000>;
37+
+ regulator-max-microvolt = <3300000>;
38+
+ regulator-always-on;
39+
+ regulator-boot-on;
40+
+ gpio = <&pio 1 7 GPIO_ACTIVE_LOW>;
41+
+ };
42+
+
43+
+ gma340_pcie: gma340-pcie {
44+
+ compatible = "regulator-fixed";
45+
+ regulator-name = "gma340-pcie";
46+
+ regulator-min-microvolt = <3300000>;
47+
+ regulator-max-microvolt = <3300000>;
48+
+ regulator-always-on;
49+
+ regulator-boot-on;
50+
+ gpio = <&pio 1 6 GPIO_ACTIVE_HIGH>;
51+
+ enable-active-high;
52+
+ };
53+
};
54+
55+
&ehci0 {
56+
@@ -434,3 +467,28 @@ w25q128: flash@0 {
57+
status = "okay";
58+
};
59+
};
60+
+
61+
+/* PCIE and USB Switch */
62+
+&combophy {
63+
+ resets = <&ccu RST_BUS_PCIE_USB3>;
64+
+ phy_use_sel = <0>; /* 0:PCIE; 1:USB3 */
65+
+ status = "okay";
66+
+};
67+
+
68+
+&pcie {
69+
+ reset-gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>;
70+
+ wake-gpios = <&pio 7 12 GPIO_ACTIVE_HIGH>;
71+
+ num-lanes = <1>;
72+
+ clk-freq-100M;
73+
+ pcie3v3-supply = <&reg_pcie_vcc3v3>;
74+
+ status = "okay";
75+
+};
76+
+
77+
+&usbc1 {
78+
+ device_type = "usbc1";
79+
+ usb_regulator_io = "nocare";
80+
+ usb_wakeup_suspend = <1>;
81+
+ wakeup-source;
82+
+ status = "okay";
83+
+};
84+
+
85+
--
86+
Armbian
87+
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Marvin Wewer <mwewer37@proton.me>
3+
Date: Mon, 5 Jan 2026 21:41:18 +0000
4+
Subject: arm64: dts: allwinner: sun55i-a523: add iommu and PCIe/USB-C nodes
5+
6+
Signed-off-by: Marvin Wewer <mwewer37@proton.me>
7+
---
8+
arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi | 84 ++++++++++
9+
1 file changed, 84 insertions(+)
10+
11+
diff --git a/arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi b/arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi
12+
index 111111111111..222222222222 100644
13+
--- a/arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi
14+
+++ b/arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi
15+
@@ -12,6 +12,7 @@
16+
#include <dt-bindings/power/allwinner,sun55i-a523-ppu.h>
17+
#include <dt-bindings/power/allwinner,sun55i-a523-pck-600.h>
18+
#include <dt-bindings/thermal/thermal.h>
19+
+#include <dt-bindings/phy/phy.h>
20+
21+
/ {
22+
interrupt-parent = <&gic>;
23+
@@ -113,6 +114,17 @@ timer {
24+
<GIC_PPI 10 IRQ_TYPE_LEVEL_HIGH>;
25+
};
26+
27+
+ iommu: iommu@2010000 {
28+
+ compatible = "allwinner,sun55i-a523-iommu";
29+
+ reg = <0x0 0x02010000 0x0 0x1000>;
30+
+ interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
31+
+ interrupt-names = "iommu-irq";
32+
+ clocks = <&ccu CLK_IOMMU>;
33+
+ clock-names = "iommu";
34+
+ /* clock-frequency = <24000000>; */
35+
+ #iommu-cells = <2>;
36+
+ };
37+
+
38+
soc {
39+
compatible = "simple-bus";
40+
#address-cells = <1>;
41+
@@ -844,6 +856,78 @@ gmac1_mtl_tx_setup: tx-queues-config {
42+
};
43+
};
44+
45+
+usbc1: usbc1@11 {
46+
+ device_type = "usbc1";
47+
+ reg = <0x11 0x1000>;
48+
+ usb_regulator_io = "nocare";
49+
+ usb_wakeup_suspend = <0>;
50+
+ status = "disabled";
51+
+};
52+
+
53+
+combophy: phy@4f00000 {
54+
+ compatible = "allwinner,inno-combphy";
55+
+ reg = <0x04f00000 0x80000>, /* Sub-System Application Registers */
56+
+ <0x04f80000 0x80000>; /* Combo INNO PHY Registers */
57+
+ reg-names = "phy-ctl", "phy-clk";
58+
+ power-domains = <&pck600 PD_PCIE>;
59+
+ phy_refclk_sel = <0>; /* 0:internal clk; 1:external clk */
60+
+ clocks = <&ccu CLK_USB3_REF>, <&ccu CLK_PLL_PERIPH0_200M>;
61+
+ clock-names = "phyclk_ref","refclk_par";
62+
+ resets = <&ccu RST_BUS_PCIE_USB3>;
63+
+ reset-names = "phy_rst";
64+
+ #phy-cells = <1>;
65+
+ status = "disabled";
66+
+};
67+
+
68+
+pcie: pcie@4800000 {
69+
+ compatible = "allwinner,sunxi-pcie-v210-rc";
70+
+ #address-cells = <3>;
71+
+ #size-cells = <2>;
72+
+ bus-range = <0x0 0xff>;
73+
+ reg = <0x04800000 0x480000>;
74+
+ reg-names = "dbi";
75+
+ device_type = "pci";
76+
+ ranges = <0x00000800 0 0x20000000 0x20000000 0 0x01000000
77+
+ 0x81000000 0 0x21000000 0x21000000 0 0x01000000
78+
+ 0x82000000 0 0x22000000 0x22000000 0 0x0e000000>;
79+
+ num-lanes = <1>;
80+
+ phys = <&combophy PHY_TYPE_PCIE>;
81+
+ phy-names = "pcie-phy";
82+
+ interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>,
83+
+ <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>,
84+
+ <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>,
85+
+ <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>,
86+
+ <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>,
87+
+ <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>,
88+
+ <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>,
89+
+ <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>,
90+
+ <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>,
91+
+ <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
92+
+ interrupt-names = "msi", "sii", "edma-w0", "edma-w1", "edma-w2", "edma-w3",
93+
+ "edma-r0", "edma-r1", "edma-r2", "edma-r3";
94+
+ #interrupt-cells = <1>;
95+
+ interrupt-map-mask = <0 0 0 7>;
96+
+ interrupt-map = <0 0 0 1 &pcie_intc 0>,
97+
+ <0 0 0 2 &pcie_intc 1>,
98+
+ <0 0 0 3 &pcie_intc 2>,
99+
+ <0 0 0 4 &pcie_intc 3>;
100+
+ num-edma = <4>;
101+
+ max-link-speed = <2>;
102+
+ num-ib-windows = <8>;
103+
+ num-ob-windows = <8>;
104+
+ linux,pci-domain = <0>;
105+
+ power-domains = <&pck600 PD_PCIE>;
106+
+ clocks = <&osc24M>, <&ccu CLK_PCIE_AUX>;
107+
+ clock-names = "hosc", "pclk_aux";
108+
+ status = "disabled";
109+
+
110+
+ pcie_intc: legacy-interrupt-controller {
111+
+ interrupt-controller;
112+
+ #address-cells = <0>;
113+
+ #interrupt-cells = <1>;
114+
+ };
115+
+};
116+
+
117+
ppu: power-controller@7001400 {
118+
compatible = "allwinner,sun55i-a523-ppu";
119+
reg = <0x07001400 0x400>;
120+
--
121+
Armbian
122+
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Marvin Wewer <mwewer37@proton.me>
3+
Date: Tue, 6 Jan 2026 13:46:53 +0000
4+
Subject: arm64: dts: allwinner: t527-orangepi-4a: enable PCIe combophy
5+
6+
Signed-off-by: Marvin Wewer <mwewer37@proton.me>
7+
---
8+
arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts | 15 ++++++++++
9+
1 file changed, 15 insertions(+)
10+
11+
diff --git a/arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts b/arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts
12+
index 111111111111..222222222222 100644
13+
--- a/arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts
14+
+++ b/arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts
15+
@@ -442,6 +442,21 @@ bluetooth {
16+
};
17+
};
18+
19+
+&combophy {
20+
+ resets = <&ccu RST_BUS_PCIE_USB3>;
21+
+ phy_use_sel = <0>;
22+
+ status = "okay";
23+
+};
24+
+
25+
+&pcie {
26+
+ reset-gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>;
27+
+ wake-gpios = <&pio 7 12 GPIO_ACTIVE_HIGH>;
28+
+ num-lanes = <2>;
29+
+ clk-freq-100M;
30+
+ pcie3v3-supply = <&reg_pcie_vcc3v3>;
31+
+ status = "okay";
32+
+};
33+
+
34+
&usb_otg {
35+
/*
36+
* The OTG controller is connected to one of the type-A ports.
37+
--
38+
Armbian
39+
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Marvin Wewer <mwewer37@proton.me>
3+
Date: Tue, 9 Dec 2025 16:43:16 +0000
4+
Subject: clk: sunxi-ng: add A523 USB3 ref clock and reset
5+
6+
Signed-off-by: Marvin Wewer <mwewer37@proton.me>
7+
---
8+
drivers/clk/sunxi-ng/ccu-sun55i-a523.c | 13 +++++++++-
9+
include/dt-bindings/clock/sun55i-a523-ccu.h | 1 +
10+
3 files changed, 13 insertions(+), 1 deletion(-)
11+
12+
diff --git a/drivers/clk/sunxi-ng/ccu-sun55i-a523.c b/drivers/clk/sunxi-ng/ccu-sun55i-a523.c
13+
index 111111111111..222222222222 100644
14+
--- a/drivers/clk/sunxi-ng/ccu-sun55i-a523.c
15+
+++ b/drivers/clk/sunxi-ng/ccu-sun55i-a523.c
16+
@@ -1186,6 +1186,15 @@ static SUNXI_CCU_MUX_DATA_WITH_GATE(fanout2_clk, "fanout2", fanout_parents,
17+
BIT(23), /* gate */
18+
0);
19+
20+
+static const struct clk_parent_data usb3_ref_parents[] = { { .fw_name = "hosc" }, { .hw = &pll_periph0_200M_clk.hw }, { .hw = &pll_periph1_200M_clk.hw } };
21+
+static SUNXI_CCU_M_DATA_WITH_MUX_GATE(usb3_ref_clk, "usb3-ref",
22+
+ usb3_ref_parents, 0x0A84,
23+
+ 0, 5, /* M */
24+
+ 24, 3, /* mux */
25+
+ BIT(31), /* gate */
26+
+ 0);
27+
+
28+
+
29+
/*
30+
* Contains all clocks that are controlled by a hardware register. They
31+
* have a (sunxi) .common member, which needs to be initialised by the common
32+
@@ -1354,6 +1363,7 @@ static struct ccu_common *sun55i_a523_ccu_clks[] = {
33+
&fanout0_clk.common,
34+
&fanout1_clk.common,
35+
&fanout2_clk.common,
36+
+ &usb3_ref_clk.common,
37+
};
38+
39+
static struct clk_hw_onecell_data sun55i_a523_hw_clks = {
40+
@@ -1538,8 +1548,9 @@ static struct clk_hw_onecell_data sun55i_a523_hw_clks = {
41+
[CLK_FANOUT1] = &fanout1_clk.common.hw,
42+
[CLK_FANOUT2] = &fanout2_clk.common.hw,
43+
[CLK_NPU] = &npu_clk.common.hw,
44+
+ [CLK_USB3_REF] = &usb3_ref_clk.common.hw,
45+
},
46+
- .num = CLK_NPU + 1,
47+
+ .num = CLK_USB3_REF + 1,
48+
};
49+
50+
static struct ccu_reset_map sun55i_a523_ccu_resets[] = {
51+
diff --git a/include/dt-bindings/clock/sun55i-a523-ccu.h b/include/dt-bindings/clock/sun55i-a523-ccu.h
52+
index 111111111111..222222222222 100644
53+
--- a/include/dt-bindings/clock/sun55i-a523-ccu.h
54+
+++ b/include/dt-bindings/clock/sun55i-a523-ccu.h
55+
@@ -186,5 +186,6 @@
56+
#define CLK_FANOUT1 177
57+
#define CLK_FANOUT2 178
58+
#define CLK_NPU 179
59+
+#define CLK_USB3_REF 180
60+
61+
#endif /* _DT_BINDINGS_CLK_SUN55I_A523_CCU_H_ */
62+
--
63+
Armbian
64+

0 commit comments

Comments
 (0)