238 lines
7.5 KiB
Diff
238 lines
7.5 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Chen-Yu Tsai <[email protected]>
|
|
Date: Sun, 21 Dec 2025 11:05:52 +0000
|
|
Subject: arm64: allwinner: a523: Support SPI controllers
|
|
|
|
Original patch by Chen-Yu Tsai.
|
|
Modified by [Marvin Wewer <[email protected]>]: Added SPI support for Radxa Cubie A5E
|
|
Documentation/devicetree/bindings/spi/allwinner,sun6i-a31-spi.yaml
|
|
arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi
|
|
arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts
|
|
drivers/spi/spi-sun6i.c
|
|
arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts
|
|
|
|
https://patchwork.kernel.org/project/linux-arm-kernel/cover/[email protected]/
|
|
|
|
Signed-off-by: Chen-Yu Tsai <[email protected]>
|
|
---
|
|
Documentation/devicetree/bindings/spi/allwinner,sun6i-a31-spi.yaml | 4 +
|
|
arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi | 94 ++++++++++
|
|
arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts | 13 ++
|
|
arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts | 15 ++
|
|
drivers/spi/spi-sun6i.c | 11 +-
|
|
5 files changed, 133 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/Documentation/devicetree/bindings/spi/allwinner,sun6i-a31-spi.yaml b/Documentation/devicetree/bindings/spi/allwinner,sun6i-a31-spi.yaml
|
|
index 111111111111..222222222222 100644
|
|
--- a/Documentation/devicetree/bindings/spi/allwinner,sun6i-a31-spi.yaml
|
|
+++ b/Documentation/devicetree/bindings/spi/allwinner,sun6i-a31-spi.yaml
|
|
@@ -17,6 +17,7 @@ properties:
|
|
compatible:
|
|
oneOf:
|
|
- const: allwinner,sun50i-r329-spi
|
|
+ - const: allwinner,sun55i-a523-spi
|
|
- const: allwinner,sun6i-a31-spi
|
|
- const: allwinner,sun8i-h3-spi
|
|
- items:
|
|
@@ -35,6 +36,9 @@ properties:
|
|
- const: allwinner,sun20i-d1-spi-dbi
|
|
- const: allwinner,sun50i-r329-spi-dbi
|
|
- const: allwinner,sun50i-r329-spi
|
|
+ - items:
|
|
+ - const: allwinner,sun55i-a523-spi-dbi
|
|
+ - const: allwinner,sun55i-a523-spi
|
|
|
|
reg:
|
|
maxItems: 1
|
|
diff --git a/arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi b/arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi
|
|
index 111111111111..222222222222 100644
|
|
--- a/arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi
|
|
+++ b/arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi
|
|
@@ -223,6 +223,43 @@ spdif_out_pi_pin: spdif-pi-pin {
|
|
allwinner,pinmux = <2>;
|
|
};
|
|
|
|
+ /omit-if-no-ref/
|
|
+ spi0_pc_pins: spi0-pc-pins {
|
|
+ pins = "PC2", "PC4", "PC12";
|
|
+ function = "spi0";
|
|
+ allwinner,pinmux = <4>;
|
|
+ };
|
|
+
|
|
+ /omit-if-no-ref/
|
|
+ spi0_cs0_pc_pin: spi0-cs0-pc-pin {
|
|
+ pins = "PC3";
|
|
+ function = "spi0";
|
|
+ allwinner,pinmux = <4>;
|
|
+ };
|
|
+
|
|
+ /omit-if-no-ref/
|
|
+ spi0_cs1_pc_pin: spi0-cs1-pc-pin {
|
|
+ pins = "PC7";
|
|
+ function = "spi0";
|
|
+ allwinner,pinmux = <4>;
|
|
+ };
|
|
+
|
|
+ /omit-if-no-ref/
|
|
+ spi0_hold_pc_pin: spi0-hold-pc-pin {
|
|
+ /* conflicts with eMMC D7 */
|
|
+ pins = "PC16";
|
|
+ function = "spi0";
|
|
+ allwinner,pinmux = <4>;
|
|
+ };
|
|
+
|
|
+ /omit-if-no-ref/
|
|
+ spi0_wp_pc_pin: spi0-wp-pc-pin {
|
|
+ /* conflicts with eMMC D2 */
|
|
+ pins = "PC15";
|
|
+ function = "spi0";
|
|
+ allwinner,pinmux = <4>;
|
|
+ };
|
|
+
|
|
uart0_pb_pins: uart0-pb-pins {
|
|
pins = "PB9", "PB10";
|
|
allwinner,pinmux = <2>;
|
|
@@ -606,6 +643,49 @@ mmc2: mmc@4022000 {
|
|
#size-cells = <0>;
|
|
};
|
|
|
|
+ spi0: spi@4025000 {
|
|
+ compatible = "allwinner,sun55i-a523-spi";
|
|
+ reg = <0x04025000 0x1000>;
|
|
+ interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
|
|
+ clocks = <&ccu CLK_BUS_SPI0>, <&ccu CLK_SPI0>;
|
|
+ clock-names = "ahb", "mod";
|
|
+ dmas = <&dma 22>, <&dma 22>;
|
|
+ dma-names = "rx", "tx";
|
|
+ resets = <&ccu RST_BUS_SPI0>;
|
|
+ status = "disabled";
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+ };
|
|
+
|
|
+ spi1: spi@4026000 {
|
|
+ compatible = "allwinner,sun55i-a523-spi-dbi",
|
|
+ "allwinner,sun55i-a523-spi";
|
|
+ reg = <0x04026000 0x1000>;
|
|
+ interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
|
|
+ clocks = <&ccu CLK_BUS_SPI1>, <&ccu CLK_SPI1>;
|
|
+ clock-names = "ahb", "mod";
|
|
+ dmas = <&dma 23>, <&dma 23>;
|
|
+ dma-names = "rx", "tx";
|
|
+ resets = <&ccu RST_BUS_SPI1>;
|
|
+ status = "disabled";
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+ };
|
|
+
|
|
+ spi2: spi@4027000 {
|
|
+ compatible = "allwinner,sun55i-a523-spi";
|
|
+ reg = <0x04027000 0x1000>;
|
|
+ interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
|
|
+ clocks = <&ccu CLK_BUS_SPI2>, <&ccu CLK_SPI2>;
|
|
+ clock-names = "ahb", "mod";
|
|
+ dmas = <&dma 24>, <&dma 24>;
|
|
+ dma-names = "rx", "tx";
|
|
+ resets = <&ccu RST_BUS_SPI2>;
|
|
+ status = "disabled";
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+ };
|
|
+
|
|
usb_otg: usb@4100000 {
|
|
compatible = "allwinner,sun55i-a523-musb",
|
|
"allwinner,sun8i-a33-musb";
|
|
@@ -858,6 +938,20 @@ rtc: rtc@7090000 {
|
|
#clock-cells = <1>;
|
|
};
|
|
|
|
+ r_spi0: spi@7092000 {
|
|
+ compatible = "allwinner,sun55i-a523-spi";
|
|
+ reg = <0x07092000 0x1000>;
|
|
+ interrupts = <GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>;
|
|
+ clocks = <&r_ccu CLK_BUS_R_SPI>, <&r_ccu CLK_R_SPI>;
|
|
+ clock-names = "ahb", "mod";
|
|
+ dmas = <&dma 53>, <&dma 53>;
|
|
+ dma-names = "rx", "tx";
|
|
+ resets = <&r_ccu RST_BUS_R_SPI>;
|
|
+ status = "disabled";
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
+ };
|
|
+
|
|
mcu_ccu: clock-controller@7102000 {
|
|
compatible = "allwinner,sun55i-a523-mcu-ccu";
|
|
reg = <0x7102000 0x200>;
|
|
diff --git a/arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts b/arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts
|
|
index 111111111111..222222222222 100644
|
|
--- a/arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts
|
|
+++ b/arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts
|
|
@@ -421,3 +421,16 @@ &usbphy {
|
|
usb1_vbus-supply = <®_usb_vbus>;
|
|
status = "okay";
|
|
};
|
|
+
|
|
+&spi0 {
|
|
+ pinctrl-names = "default";
|
|
+ pinctrl-0 = <&spi0_pc_pins>, <&spi0_cs0_pc_pin>;
|
|
+ status = "okay";
|
|
+ w25q128: flash@0 {
|
|
+ compatible = "winbond,w25q128fw", "jedec,spi-nor";
|
|
+ reg = <0>;
|
|
+ spi-max-frequency = <24000000>;
|
|
+ vcc-supply = <®_cldo1>;
|
|
+ status = "okay";
|
|
+ };
|
|
+};
|
|
diff --git a/arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts b/arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts
|
|
index 111111111111..222222222222 100644
|
|
--- a/arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts
|
|
+++ b/arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts
|
|
@@ -403,6 +403,21 @@ &rtc {
|
|
assigned-clock-rates = <32768>;
|
|
};
|
|
|
|
+&spi0 {
|
|
+ pinctrl-names = "default";
|
|
+ pinctrl-0 = <&spi0_pc_pins>, <&spi0_cs0_pc_pin>;
|
|
+ status = "okay";
|
|
+
|
|
+ flash@0 {
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <1>;
|
|
+ compatible = "jedec,spi-nor";
|
|
+ reg = <0>;
|
|
+ spi-max-frequency = <20000000>;
|
|
+ vcc-supply = <®_cldo1>;
|
|
+ };
|
|
+};
|
|
+
|
|
&uart0 {
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&uart0_pb_pins>;
|
|
diff --git a/drivers/spi/spi-sun6i.c b/drivers/spi/spi-sun6i.c
|
|
index 111111111111..222222222222 100644
|
|
--- a/drivers/spi/spi-sun6i.c
|
|
+++ b/drivers/spi/spi-sun6i.c
|
|
@@ -795,10 +795,13 @@ static const struct sun6i_spi_cfg sun50i_r329_spi_cfg = {
|
|
static const struct of_device_id sun6i_spi_match[] = {
|
|
{ .compatible = "allwinner,sun6i-a31-spi", .data = &sun6i_a31_spi_cfg },
|
|
{ .compatible = "allwinner,sun8i-h3-spi", .data = &sun8i_h3_spi_cfg },
|
|
- {
|
|
- .compatible = "allwinner,sun50i-r329-spi",
|
|
- .data = &sun50i_r329_spi_cfg
|
|
- },
|
|
+ { .compatible = "allwinner,sun50i-r329-spi", .data = &sun50i_r329_spi_cfg },
|
|
+ /*
|
|
+ * A523's SPI controller has a combined RX buffer + FIFO counter
|
|
+ * at offset 0x400, instead of split buffer count in FIFO status
|
|
+ * register. But in practice we only care about the FIFO level.
|
|
+ */
|
|
+ { .compatible = "allwinner,sun55i-a523-spi", .data = &sun50i_r329_spi_cfg },
|
|
{}
|
|
};
|
|
MODULE_DEVICE_TABLE(of, sun6i_spi_match);
|
|
--
|
|
Armbian
|
|
|