Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-pro.dtsi
38306 views
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
/*
 * Copyright (C) 2025 MediaTek Inc.
 * Author: Sam.Shih <[email protected]>
 * Author: Frank Wunderlich <[email protected]>
 */

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