]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm64: dts: mediatek: mt7988: Add devicetree for BananaPi R4 Pro
authorFrank Wunderlich <frank-w@public-files.de>
Wed, 5 Nov 2025 19:50:03 +0000 (20:50 +0100)
committerAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Thu, 6 Nov 2025 09:02:58 +0000 (10:02 +0100)
Add devicetree for Bpi-R4-Pro.

BananaPi R4 Pro is a MT7988A based board which exists in 2 different
hardware versions:

- 4E: 4 GB RAM and using internal 2.5G Phy for WAN-Combo
- 8X: 8 GB RAM and 2x Aeonsemi AS21010P 10G phys

common parts:

- MediaTek MT7988A Quad-core Arm Corex-A73,1.8GHz processor
- 8GB eMMC flash
- 256MB SPI-NAND Flash
- Micro SD card slot
- 1x 10G SFP+ WAN
- 1x 10G SFP+ LAN
- 4x 2.5G RJ45 LAN (MxL86252C)
- 1x 1G RJ45 LAN (MT7988 internal switch)
- 2x miniPCIe slots with PCIe3.0 2lane interface for Wi-Fi NIC
- 2x M.2 M-KEY slots with PCIe3.0 1lane interface for NVME SSD
- 3x M.2 B-KEY slots with USB3.2 for 5G Module (PCIe shared with key-m)
- 1x USB3.2 slot
- 1x USB2.0 slot
- 1x USB TypeC Debug Console
- 2x13 PIN Header for expanding application

https://docs.banana-pi.org/en/BPI-R4_Pro/BananaPi_BPI-R4_Pro

The PCIe is per default in key-m state and can be changed to key-b with
the pcie-overlays.

Signed-off-by: Frank Wunderlich <frank-w@public-files.de>
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
arch/arm64/boot/dts/mediatek/Makefile
arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro-4e.dts [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro-8x.dts [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt7988a.dtsi

index 774fb0d6252de1e109d1d5a7c132e645892bce49..71afcda690d2b7fdc2f62cd6cd615c7b9fbcce29 100644 (file)
@@ -24,6 +24,8 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt7986b-rfb.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt7988a-bananapi-bpi-r4.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt7988a-bananapi-bpi-r4-2g5.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt7988a-bananapi-bpi-r4-emmc.dtbo
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt7988a-bananapi-bpi-r4-pro-4e.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt7988a-bananapi-bpi-r4-pro-8x.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt7988a-bananapi-bpi-r4-sd.dtbo
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8167-pumpkin.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8173-elm.dtb
@@ -114,4 +116,6 @@ DTC_FLAGS_mt7986a-bananapi-bpi-r3 := -@
 DTC_FLAGS_mt7986a-bananapi-bpi-r3-mini := -@
 DTC_FLAGS_mt7988a-bananapi-bpi-r4 := -@
 DTC_FLAGS_mt7988a-bananapi-bpi-r4-2g5 := -@
+DTC_FLAGS_mt7988a-bananapi-bpi-r4-pro-4e := -@
+DTC_FLAGS_mt7988a-bananapi-bpi-r4-pro-8x := -@
 DTC_FLAGS_mt8395-radxa-nio-12l := -@
diff --git a/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro-4e.dts b/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro-4e.dts
new file mode 100644 (file)
index 0000000..c7ea6e8
--- /dev/null
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (C) 2025 MediaTek Inc.
+ * Author: Frank Wunderlich <frank-w@public-files.de>
+ */
+
+/dts-v1/;
+
+#include "mt7988a-bananapi-bpi-r4-pro.dtsi"
+
+/ {
+       model = "Bananapi BPI-R4";
+       compatible = "bananapi,bpi-r4-pro-4e",
+                    "bananapi,bpi-r4-pro",
+                    "mediatek,mt7988a";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro-8x.dts b/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro-8x.dts
new file mode 100644 (file)
index 0000000..c9a0e69
--- /dev/null
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (C) 2025 MediaTek Inc.
+ * Author: Frank Wunderlich <frank-w@public-files.de>
+ */
+
+/dts-v1/;
+
+#include "mt7988a-bananapi-bpi-r4-pro.dtsi"
+
+/ {
+       model = "Bananapi BPI-R4";
+       compatible = "bananapi,bpi-r4-pro-8x",
+                    "bananapi,bpi-r4-pro",
+                    "mediatek,mt7988a";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro.dtsi b/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro.dtsi
new file mode 100644 (file)
index 0000000..a48132f
--- /dev/null
@@ -0,0 +1,534 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (C) 2025 MediaTek Inc.
+ * Author: Sam.Shih <sam.shih@mediatek.com>
+ * Author: Frank Wunderlich <frank-w@public-files.de>
+ */
+
+/dts-v1/;
+
+#include "mt7988a.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+#include <dt-bindings/regulator/richtek,rt5190a-regulator.h>
+
+/ {
+       aliases {
+               ethernet0 = &gmac0;
+               i2c0 = &i2c0;
+               i2c1 = &i2c1;
+               i2c2 = &i2c2;
+               /* PCA9548 (0-0070) provides 4 i2c channels */
+               i2c3 = &imux0;
+               i2c4 = &imux1_sfp1;
+               i2c5 = &imux2_sfp2;
+               i2c6 = &imux3_wifi;
+       };
+
+       chosen {
+               stdout-path = &serial0;
+       };
+
+       fan: pwm-fan {
+               compatible = "pwm-fan";
+               /* cooling level (0, 1, 2, 3) : (0% duty, 30% duty, 50% duty, 100% duty) */
+               cooling-levels = <0 80 128 255>;
+               pinctrl-0 = <&pwm0_pins>;
+               pinctrl-names = "default";
+               pwms = <&pwm 0 50000>;
+               #cooling-cells = <2>;
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               button-reset {
+                       label = "reset";
+                       gpios = <&pio 13 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_RESTART>;
+               };
+
+               button-wps {
+                       label = "WPS";
+                       gpios = <&pio 14 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_WPS_BUTTON>;
+               };
+       };
+
+       gpio-leds {
+               compatible = "gpio-leds";
+
+               led_red: sys-led-red {
+                       color = <LED_COLOR_ID_RED>;
+                       gpios = <&pca9555 15 GPIO_ACTIVE_HIGH>;
+                       default-state = "on";
+               };
+
+               led_blue: sys-led-blue {
+                       color = <LED_COLOR_ID_BLUE>;
+                       gpios = <&pca9555 14 GPIO_ACTIVE_HIGH>;
+                       default-state = "on";
+               };
+       };
+
+       reg_1p8v: regulator-dvdd1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "DVDD1V8_SOC";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
+       reg_3p3v: regulator-3v3vd {
+               compatible = "regulator-fixed";
+               regulator-name = "3V3VD";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
+       /* SFP1 cage (LAN) */
+       sfp1: sfp1 {
+               compatible = "sff,sfp";
+               i2c-bus = <&imux1_sfp1>;
+               los-gpios = <&pio 70 GPIO_ACTIVE_HIGH>;
+               mod-def0-gpios = <&pio 69 GPIO_ACTIVE_LOW>;
+               tx-disable-gpios = <&pio 21 GPIO_ACTIVE_HIGH>;
+               maximum-power-milliwatt = <3000>;
+       };
+
+       /* SFP2 cage (WAN) */
+       sfp2: sfp2 {
+               compatible = "sff,sfp";
+               i2c-bus = <&imux2_sfp2>;
+               los-gpios = <&pio 2 GPIO_ACTIVE_HIGH>;
+               mod-def0-gpios = <&pio 1 GPIO_ACTIVE_LOW>;
+               tx-disable-gpios = <&pio 0 GPIO_ACTIVE_HIGH>;
+               maximum-power-milliwatt = <3000>;
+       };
+};
+
+&cci {
+       proc-supply = <&rt5190_buck3>;
+};
+
+&cpu0 {
+       proc-supply = <&rt5190_buck3>;
+};
+
+&cpu1 {
+       proc-supply = <&rt5190_buck3>;
+};
+
+&cpu2 {
+       proc-supply = <&rt5190_buck3>;
+};
+
+&cpu3 {
+       proc-supply = <&rt5190_buck3>;
+};
+
+&cpu_thermal {
+       trips {
+               cpu_trip_hot: hot {
+                       temperature = <120000>;
+                       hysteresis = <2000>;
+                       type = "hot";
+               };
+
+               cpu_trip_active_high: active-high {
+                       temperature = <115000>;
+                       hysteresis = <2000>;
+                       type = "active";
+               };
+
+               cpu_trip_active_med: active-med {
+                       temperature = <85000>;
+                       hysteresis = <2000>;
+                       type = "active";
+               };
+
+               cpu_trip_active_low: active-low {
+                       temperature = <40000>;
+                       hysteresis = <2000>;
+                       type = "active";
+               };
+       };
+
+       cooling-maps {
+               map-cpu-active-high {
+                       /* active: set fan to cooling level 2 */
+                       cooling-device = <&fan 3 3>;
+                       trip = <&cpu_trip_active_high>;
+               };
+
+               map-cpu-active-med {
+                       /* active: set fan to cooling level 1 */
+                       cooling-device = <&fan 2 2>;
+                       trip = <&cpu_trip_active_med>;
+               };
+
+               map-cpu-active-low {
+                       /* active: set fan to cooling level 0 */
+                       cooling-device = <&fan 1 1>;
+                       trip = <&cpu_trip_active_low>;
+               };
+       };
+};
+
+&eth {
+       pinctrl-0 = <&mdio0_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&fan {
+       pinctrl-0 = <&pwm0_pins>;
+       pinctrl-names = "default";
+       pwms = <&pwm 0 50000>;
+       status = "okay";
+};
+
+&gmac0 {
+       status = "okay";
+};
+
+&gsw_phy0 {
+       pinctrl-0 = <&gbe0_led0_pins>;
+       pinctrl-names = "gbe-led";
+};
+
+&gsw_phy0_led0 {
+       color = <LED_COLOR_ID_YELLOW>;
+       status = "okay";
+};
+
+&gsw_port0 {
+       label = "mgmt";
+};
+
+/* R4Pro has only port 0 connected, so disable the others */
+&gsw_phy1 {
+       status = "disabled";
+};
+
+&gsw_port1 {
+       status = "disabled";
+};
+
+&gsw_phy2 {
+       status = "disabled";
+};
+
+&gsw_port2 {
+       status = "disabled";
+};
+
+&gsw_phy3 {
+       status = "disabled";
+};
+
+&gsw_port3 {
+       status = "disabled";
+};
+
+&i2c0 {
+       pinctrl-0 = <&i2c0_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       rt5190a_64: rt5190a@64 {
+               compatible = "richtek,rt5190a";
+               reg = <0x64>;
+               vin2-supply = <&rt5190_buck1>;
+               vin3-supply = <&rt5190_buck1>;
+               vin4-supply = <&rt5190_buck1>;
+
+               regulators {
+                       rt5190_buck1: buck1 {
+                               regulator-name = "rt5190a-buck1";
+                               regulator-min-microvolt = <5090000>;
+                               regulator-max-microvolt = <5090000>;
+                               regulator-allowed-modes =
+                               <RT5190A_OPMODE_AUTO RT5190A_OPMODE_FPWM>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       buck2 {
+                               regulator-name = "vcore";
+                               regulator-min-microvolt = <600000>;
+                               regulator-max-microvolt = <1400000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       rt5190_buck3: buck3 {
+                               regulator-name = "vproc";
+                               regulator-min-microvolt = <600000>;
+                               regulator-max-microvolt = <1400000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       buck4 {
+                               regulator-name = "rt5190a-buck4";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-allowed-modes =
+                               <RT5190A_OPMODE_AUTO RT5190A_OPMODE_FPWM>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo {
+                               regulator-name = "rt5190a-ldo";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+               };
+       };
+};
+
+&i2c1 {
+       pinctrl-0 = <&i2c1_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&i2c2 {
+       pinctrl-0 = <&i2c2_1_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       pca9545: i2c-mux@70 {
+               compatible = "nxp,pca9545";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               imux0: i2c@0 {
+                       reg = <0>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       pca9555: i2c-gpio-expander@20 {
+                               compatible = "nxp,pca9555";
+                               reg = <0x20>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                       };
+
+                       rtc@51 {
+                               compatible = "nxp,pcf8563";
+                               reg = <0x51>;
+                       };
+
+                       eeprom@57 {
+                               compatible = "atmel,24c02";
+                               reg = <0x57>;
+                               address-width = <8>;
+                               pagesize = <8>;
+                               size = <256>;
+                       };
+               };
+
+               imux1_sfp1: i2c@1 {
+                       reg = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               imux2_sfp2: i2c@2 {
+                       reg = <2>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               imux3_wifi: i2c@3 {
+                       reg = <3>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+       };
+};
+
+/* mPCIe SIM2 (11300000) */
+&pcie0 {
+       status = "okay";
+};
+
+/* mPCIe (11310000 near leds) SIM3 */
+&pcie1 {
+       status = "okay";
+};
+
+/* M.2 (11280000) 1L0 key-m SSD1 CN13 / key-b SIM1 CN15 */
+&pcie2 {
+       status = "okay";
+};
+
+/* M.2 (11290000) 1L1 key-m SSD2 CN14 / key-b SIM2 CN18 */
+&pcie3 {
+       status = "okay";
+};
+
+&pio {
+       gbe0_led0_pins: gbe0-led0-pins {
+               mux {
+                       function = "led";
+                       groups = "gbe0_led0";
+               };
+       };
+
+       i2c0_pins: i2c0-g0-pins {
+               mux {
+                       function = "i2c";
+                       groups = "i2c0_1";
+               };
+       };
+
+       i2c1_pins: i2c1-g0-pins {
+               mux {
+                       function = "i2c";
+                       groups = "i2c1_0";
+               };
+       };
+
+       i2c2_1_pins: i2c2-g1-pins {
+               mux {
+                       function = "i2c";
+                       groups = "i2c2_1";
+               };
+       };
+
+       mdio0_pins: mdio0-pins {
+               mux {
+                       function = "eth";
+                       groups = "mdc_mdio0";
+               };
+
+               conf {
+                       pins = "SMI_0_MDC", "SMI_0_MDIO";
+                       drive-strength = <8>;
+               };
+       };
+
+       mmc0_pins_emmc_51: mmc0-emmc-51-pins {
+               mux {
+                       function = "flash";
+                       groups = "emmc_51";
+               };
+       };
+
+       mmc0_pins_sdcard: mmc0-sdcard-pins {
+               mux {
+                       function = "flash";
+                       groups = "sdcard";
+               };
+       };
+
+       /* 1L0 0=key-b (CN15), 1=key-m (CN13) */
+       pcie-2-hog {
+               gpio-hog;
+               gpios = <79 GPIO_ACTIVE_HIGH>;
+               output-high;
+       };
+
+       /* 1L1 0=key-b (CN18), 1=key-m (CN14) */
+       pcie-3-hog {
+               gpio-hog;
+               gpios = <63 GPIO_ACTIVE_HIGH>;
+               output-high;
+       };
+
+       pwm0_pins: pwm0-pins {
+               mux {
+                       groups = "pwm0";
+                       function = "pwm";
+               };
+       };
+
+       spi0_flash_pins: spi0-flash-pins {
+               mux {
+                       function = "spi";
+                       groups = "spi0", "spi0_wp_hold";
+               };
+       };
+};
+
+&pwm {
+       status = "okay";
+};
+
+&serial0 {
+       status = "okay";
+};
+
+&spi0 {
+       pinctrl-0 = <&spi0_flash_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       spi_nand: nand@0 {
+               compatible = "spi-nand";
+               reg = <0>;
+               spi-max-frequency = <52000000>;
+               spi-rx-bus-width = <4>;
+               spi-tx-bus-width = <4>;
+       };
+};
+
+&spi_nand {
+       partitions {
+               compatible = "fixed-partitions";
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               partition@0 {
+                       reg = <0x0 0x200000>;
+                       label = "bl2";
+               };
+
+               partition@200000 {
+                       compatible = "linux,ubi";
+                       reg = <0x200000 0xfe00000>;
+                       label = "ubi";
+               };
+       };
+};
+
+/* back USB */
+&ssusb0 {
+       /* Use U2P only instead of both U3P/U2P due to U3P serdes shared with pcie2 */
+       phys = <&xphyu2port0 PHY_TYPE_USB2>;
+       mediatek,u3p-dis-msk = <1>;
+       status = "okay";
+};
+
+/* front USB */
+&ssusb1 {
+       status = "okay";
+};
+
+&switch {
+       dsa,member = <1 0>;
+       status = "okay";
+};
+
+&tphy {
+       status = "okay";
+};
+
+&watchdog {
+       status = "okay";
+};
+
+&xsphy {
+       status = "okay";
+};
index 1f9abc9710c514cad963b3a90b144570fbc8ce9d..bec590d26659c0e242736e65065a6c1e5fbc18b9 100644 (file)
                        nvmem-cell-names = "lvts-calib-data-1";
                };
 
-               usb@11190000 {
+               ssusb0: usb@11190000 {
                        compatible = "mediatek,mt7988-xhci", "mediatek,mtk-xhci";
                        reg = <0 0x11190000 0 0x2e00>,
                              <0 0x11193e00 0 0x0100>;