arm64: dts: mediatek: mt7988: Add devicetree for BananaPi R4 Pro

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>
This commit is contained in:
Frank Wunderlich 2025-11-05 20:50:03 +01:00 committed by AngeloGioacchino Del Regno
parent 0e5d9e5293
commit f397471a6a
No known key found for this signature in database
GPG Key ID: 9A3604CFAD978478
5 changed files with 571 additions and 1 deletions

View 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 := -@

View File

@ -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";
};

View File

@ -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";
};

View File

@ -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";
};

View File

@ -418,7 +418,7 @@ lvts: lvts@1100a000 {
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>;