Files
linux/arch/arm64/boot/dts/broadcom/bcm2712-rpi-5-b.dts
Phil Elwell 75f3baf265 fixup! BCM2708: Add core Device Tree support
Leave pcie1/pciex1/nvme disabled unless a DT parameter is used.

Signed-off-by: Phil Elwell <phil@raspberrypi.com>
2025-12-02 14:26:01 +00:00

772 lines
15 KiB
Plaintext

// SPDX-License-Identifier: (GPL-2.0 OR MIT)
/dts-v1/;
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/clock/rp1.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/mfd/rp1.h>
#include <dt-bindings/pwm/pwm.h>
#include <dt-bindings/reset/raspberrypi,firmware-reset.h>
#include "bcm2712-ds.dtsi"
/ {
compatible = "raspberrypi,5-model-b", "brcm,bcm2712";
model = "Raspberry Pi 5";
/* Will be filled by the bootloader */
memory@0 {
device_type = "memory";
#ifndef FIRMWARE_UPDATED
reg = <0 0 0x28000000>;
#else
reg = <0 0 0 0x28000000>;
#endif
};
leds: leds {
compatible = "gpio-leds";
led_pwr: led-pwr {
label = "PWR";
gpios = <&rp1_gpio 44 GPIO_ACTIVE_LOW>;
default-state = "off";
linux,default-trigger = "none";
};
led_act: led-act {
label = "ACT";
gpios = <&gio_aon 9 GPIO_ACTIVE_LOW>;
default-state = "off";
linux,default-trigger = "mmc0";
};
};
sd_io_1v8_reg: sd-io-1v8-reg {
compatible = "regulator-gpio";
regulator-name = "vdd-sd-io";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <3300000>;
regulator-boot-on;
regulator-always-on;
regulator-settling-time-us = <5000>;
gpios = <&gio_aon 3 GPIO_ACTIVE_HIGH>;
states = <1800000 1>,
<3300000 0>;
};
sd_vcc_reg: sd-vcc-reg {
compatible = "regulator-fixed";
regulator-name = "vcc-sd";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-boot-on;
enable-active-high;
gpios = <&gio_aon 4 GPIO_ACTIVE_HIGH>;
};
wl_on_reg: wl-on-reg {
compatible = "regulator-fixed";
regulator-name = "wl-on-regulator";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
pinctrl-0 = <&wl_on_pins>;
pinctrl-names = "default";
gpio = <&gio 28 GPIO_ACTIVE_HIGH>;
startup-delay-us = <150000>;
enable-active-high;
};
cam1_clk: cam1_clk {
compatible = "fixed-clock";
#clock-cells = <0>;
status = "disabled";
};
cam0_clk: cam0_clk {
compatible = "fixed-clock";
#clock-cells = <0>;
status = "disabled";
};
cam0_reg: cam0_reg {
compatible = "regulator-fixed";
regulator-name = "cam0_reg";
enable-active-high;
gpio = <&rp1_gpio 34 0>; // CD0_IO0_MICCLK, to MIPI 0 connector
};
cam1_reg: cam1_reg {
compatible = "regulator-fixed";
regulator-name = "cam1_reg";
enable-active-high;
gpio = <&rp1_gpio 46 0>; // CD1_IO0_MICCLK, to MIPI 1 connector
};
cam_dummy_reg: cam_dummy_reg {
compatible = "regulator-fixed";
regulator-name = "cam-dummy-reg";
};
dummy: dummy {
// A target for unwanted overlay fragments
};
// A few extra labels to keep overlays happy
i2c0if: i2c0if {};
i2c0mux: i2c0mux {};
};
rp1_target: &pcie2 {
brcm,vdm-qos-map = /bits/ 8 <8 8 8 9 10 10 11 11>;
aspm-no-l0s;
status = "okay";
};
&pcie1 {
brcm,fifo-qos-map = /bits/ 8 <3 3 3 3>;
};
// The system SPI for the bootloader EEPROM
&spi10 { status = "okay"; };
#include "rp1.dtsi"
&rp1 {
// PCIe address space layout:
// 00_00000000-00_00xxxxxx = RP1 peripherals
// 10_00000000-1x_xxxxxxxx = up to 64GB system RAM
// outbound access aimed at PCIe 0_00xxxxxx -> RP1 c0_40xxxxxx
// This is the RP1 peripheral space
ranges = <0xc0 0x40000000
0x02000000 0x00 0x00000000
0x00 0x00410000>;
dma-ranges =
// inbound RP1 1x_xxxxxxxx -> PCIe 1x_xxxxxxxx
<0x10 0x00000000
0x43000000 0x10 0x00000000
0x10 0x00000000>,
// inbound RP1 c0_40xxxxxx -> PCIe 00_00xxxxxx
// This allows the RP1 DMA controller to address RP1 hardware
<0xc0 0x40000000
0x02000000 0x0 0x00000000
0x0 0x00410000>,
// inbound RP1 0x_xxxxxxxx -> PCIe 1x_xxxxxxxx
<0x00 0x00000000
0x02000000 0x10 0x00000000
0x10 0x00000000>;
};
// Expose RP1 nodes as system nodes with labels
&rp1_dma {
status = "okay";
};
&rp1_eth {
status = "okay";
phy-handle = <&phy1>;
phy-reset-gpios = <&rp1_gpio 32 GPIO_ACTIVE_LOW>;
phy-reset-duration = <5>;
phy1: ethernet-phy@1 {
reg = <0x1>;
brcm,powerdown-enable;
eee-broken-1000t;
eee-broken-100tx;
};
};
/* The Debug UART, on Rpi5 it's on JST-SH 1.0mm 3-pin connector
* labeled "UART", i.e. the interface with the system console.
*/
&uart10 {
status = "okay";
};
gpio: &rp1_gpio {
status = "okay";
};
aux: &dummy {};
&rp1_usb0 {
pinctrl-0 = <&usb_vbus_pins>;
pinctrl-names = "default";
status = "okay";
};
&rp1_usb1 {
status = "okay";
};
#include "bcm2712-rpi.dtsi"
i2c_csi_dsi0: &i2c6 { // Note: This is for MIPI0 connector only
pinctrl-0 = <&rp1_i2c6_38_39>;
pinctrl-names = "default";
clock-frequency = <100000>;
symlink = "i2c-6";
};
i2c_csi_dsi1: &i2c4 { // Note: This is for MIPI1 connector only
pinctrl-0 = <&rp1_i2c4_40_41>;
pinctrl-names = "default";
clock-frequency = <100000>;
symlink = "i2c-4";
};
i2c_csi_dsi: &i2c_csi_dsi1 { }; // An alias for compatibility
csi0: &rp1_csi0 { };
csi1: &rp1_csi1 { };
dsi0: &rp1_dsi0 { };
dsi1: &rp1_dsi1 { };
dpi: &rp1_dpi { };
vec: &rp1_vec { };
dpi_gpio0: &rp1_dpi_24bit_gpio0 { };
dpi_gpio1: &rp1_dpi_24bit_gpio2 { };
dpi_18bit_cpadhi_gpio0: &rp1_dpi_18bit_cpadhi_gpio0 { };
dpi_18bit_cpadhi_gpio2: &rp1_dpi_18bit_cpadhi_gpio2 { };
dpi_18bit_gpio0: &rp1_dpi_18bit_gpio0 { };
dpi_18bit_gpio2: &rp1_dpi_18bit_gpio2 { };
dpi_16bit_cpadhi_gpio0: &rp1_dpi_16bit_cpadhi_gpio0 { };
dpi_16bit_cpadhi_gpio2: &rp1_dpi_16bit_cpadhi_gpio2 { };
dpi_16bit_gpio0: &rp1_dpi_16bit_gpio0 { };
dpi_16bit_gpio2: &rp1_dpi_16bit_gpio2 { };
/* Add the IOMMUs for some RP1 bus masters */
&csi0 {
iommus = <&iommu5>;
};
&csi1 {
iommus = <&iommu5>;
};
&dsi0 {
iommus = <&iommu5>;
};
&dsi1 {
iommus = <&iommu5>;
};
&dpi {
iommus = <&iommu5>;
};
&vec {
iommus = <&iommu5>;
};
&ddc0 {
status = "disabled";
};
&ddc1 {
status = "disabled";
};
&hdmi0 {
clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 0>, <&clk_27MHz>;
clock-names = "hdmi", "bvb", "audio", "cec";
status = "disabled";
};
&hdmi1 {
clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 1>, <&clk_27MHz>;
clock-names = "hdmi", "bvb", "audio", "cec";
status = "disabled";
};
&hvs {
clocks = <&firmware_clocks 4>, <&firmware_clocks 16>;
clock-names = "core", "disp";
};
&mop {
status = "disabled";
};
&moplet {
status = "disabled";
};
&pixelvalve0 {
status = "disabled";
};
&pixelvalve1 {
status = "disabled";
};
&disp_intr {
status = "disabled";
};
/* SDIO1 is used to drive the SD card */
&sdio1 {
pinctrl-0 = <&emmc_sd_pulls>, <&emmc_aon_cd_pins>;
pinctrl-names = "default";
vqmmc-supply = <&sd_io_1v8_reg>;
vmmc-supply = <&sd_vcc_reg>;
bus-width = <4>;
sd-uhs-sdr50;
sd-uhs-ddr50;
sd-uhs-sdr104;
supports-cqe = <1>;
cd-gpios = <&gio_aon 5 GPIO_ACTIVE_LOW>;
//no-1-8-v;
status = "okay";
};
&pinctrl_aon {
emmc_aon_cd_pins: emmc_aon_cd_pins {
function = "sd_card_g";
pins = "aon_gpio5";
bias-pull-up;
};
/* Slight hack - only one PWM pin (status LED) is usable */
aon_pwm_1pin: aon_pwm_1pin {
function = "aon_pwm";
pins = "aon_gpio9";
};
};
&pinctrl {
pwr_button_pins: pwr_button_pins {
function = "gpio";
pins = "gpio20";
bias-pull-up;
};
wl_on_pins: wl_on_pins {
function = "gpio";
pins = "gpio28";
};
bt_shutdown_pins: bt_shutdown_pins {
function = "gpio";
pins = "gpio29";
};
emmc_sd_pulls: emmc_sd_pulls {
pins = "emmc_cmd", "emmc_dat0", "emmc_dat1", "emmc_dat2", "emmc_dat3";
bias-pull-up;
};
};
/* uarta communicates with the BT module */
&uarta {
uart-has-rtscts;
auto-flow-control;
status = "okay";
clock-frequency = <96000000>;
pinctrl-0 = <&uarta_24_pins &bt_shutdown_pins>;
pinctrl-names = "default";
bluetooth: bluetooth {
compatible = "brcm,bcm43438-bt";
max-speed = <3000000>;
shutdown-gpios = <&gio 29 GPIO_ACTIVE_HIGH>;
local-bd-address = [ 00 00 00 00 00 00 ];
};
};
&i2c10 {
clock-frequency = <400000>;
pinctrl-0 = <&i2c3_m4_agpio0_pins>;
pinctrl-names = "default";
};
/ {
fan: cooling_fan {
status = "disabled";
compatible = "pwm-fan";
#cooling-cells = <2>;
cooling-min-state = <0>;
cooling-max-state = <3>;
cooling-levels = <0 75 125 175 250>;
pwms = <&rp1_pwm1 3 41566 PWM_POLARITY_INVERTED>;
rpm-regmap = <&rp1_pwm1>;
rpm-offset = <0x3c>;
};
pwr_button {
compatible = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <&pwr_button_pins>;
status = "okay";
pwr_key: pwr {
label = "pwr_button";
// linux,code = <205>; // KEY_SUSPEND
linux,code = <116>; // KEY_POWER
gpios = <&gio 20 GPIO_ACTIVE_LOW>;
debounce-interval = <50>; // ms
};
};
};
&usb {
power-domains = <&power RPI_POWER_DOMAIN_USB>;
};
/* SDIO2 drives the WLAN interface */
&sdio2 {
pinctrl-0 = <&sdio2_30_pins>;
pinctrl-names = "default";
bus-width = <4>;
vmmc-supply = <&wl_on_reg>;
sd-uhs-ddr50;
non-removable;
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
wifi: wifi@1 {
reg = <1>;
compatible = "brcm,bcm4329-fmac";
local-mac-address = [00 00 00 00 00 00];
};
};
&pinctrl {
spi10_gpio2: spi10_gpio2 {
function = "vc_spi0";
pins = "gpio2", "gpio3", "gpio4";
bias-disable;
};
spi10_cs_gpio1: spi10_cs_gpio1 {
function = "gpio";
pins = "gpio1";
bias-pull-up;
};
};
spi10_pins: &spi10_gpio2 {};
spi10_cs_pins: &spi10_cs_gpio1 {};
&spi10 {
pinctrl-names = "default";
cs-gpios = <&gio 1 1>;
pinctrl-0 = <&spi10_pins &spi10_cs_pins>;
spidev10: spidev@0 {
compatible = "spidev";
reg = <0>; /* CE0 */
#address-cells = <1>;
#size-cells = <0>;
spi-max-frequency = <20000000>;
status = "okay";
};
};
// =============================================
// Board specific stuff here
&gio_aon {
// Don't use GIO_AON as an interrupt controller because it will
// clash with the firmware monitoring the PMIC interrupt via the VPU.
/delete-property/ interrupt-controller;
/delete-property/ #interrupt-cells;
};
&main_aon_irq {
// Don't use the MAIN_AON_IRQ interrupt controller because it will
// clash with the firmware monitoring the PMIC interrupt via the VPU.
status = "disabled";
};
&rp1_pwm1 {
status = "disabled";
pinctrl-0 = <&rp1_pwm1_gpio45>;
pinctrl-names = "default";
};
&thermal_trips {
cpu_tepid: cpu-tepid {
temperature = <50000>;
hysteresis = <5000>;
type = "active";
};
cpu_warm: cpu-warm {
temperature = <60000>;
hysteresis = <5000>;
type = "active";
};
cpu_hot: cpu-hot {
temperature = <67500>;
hysteresis = <5000>;
type = "active";
};
cpu_vhot: cpu-vhot {
temperature = <75000>;
hysteresis = <5000>;
type = "active";
};
};
&cooling_maps {
tepid {
trip = <&cpu_tepid>;
cooling-device = <&fan 1 1>;
};
warm {
trip = <&cpu_warm>;
cooling-device = <&fan 2 2>;
};
hot {
trip = <&cpu_hot>;
cooling-device = <&fan 3 3>;
};
vhot {
trip = <&cpu_vhot>;
cooling-device = <&fan 4 4>;
};
melt {
trip = <&cpu_crit>;
cooling-device = <&fan 4 4>;
};
};
&gio {
// The GPIOs above 35 are not used on Pi 5, so shrink the upper bank
// to reduce the clutter in gpioinfo/pinctrl
brcm,gpio-bank-widths = <32 4>;
gpio-line-names =
"-", // GPIO_000
"2712_BOOT_CS_N", // GPIO_001
"2712_BOOT_MISO", // GPIO_002
"2712_BOOT_MOSI", // GPIO_003
"2712_BOOT_SCLK", // GPIO_004
"-", // GPIO_005
"-", // GPIO_006
"-", // GPIO_007
"-", // GPIO_008
"-", // GPIO_009
"-", // GPIO_010
"-", // GPIO_011
"-", // GPIO_012
"-", // GPIO_013
"PCIE_SDA", // GPIO_014
"PCIE_SCL", // GPIO_015
"-", // GPIO_016
"-", // GPIO_017
"-", // GPIO_018
"-", // GPIO_019
"PWR_GPIO", // GPIO_020
"2712_G21_FS", // GPIO_021
"-", // GPIO_022
"-", // GPIO_023
"BT_RTS", // GPIO_024
"BT_CTS", // GPIO_025
"BT_TXD", // GPIO_026
"BT_RXD", // GPIO_027
"WL_ON", // GPIO_028
"BT_ON", // GPIO_029
"WIFI_SDIO_CLK", // GPIO_030
"WIFI_SDIO_CMD", // GPIO_031
"WIFI_SDIO_D0", // GPIO_032
"WIFI_SDIO_D1", // GPIO_033
"WIFI_SDIO_D2", // GPIO_034
"WIFI_SDIO_D3"; // GPIO_035
};
&gio_aon {
gpio-line-names =
"RP1_SDA", // AON_GPIO_00
"RP1_SCL", // AON_GPIO_01
"RP1_RUN", // AON_GPIO_02
"SD_IOVDD_SEL", // AON_GPIO_03
"SD_PWR_ON", // AON_GPIO_04
"SD_CDET_N", // AON_GPIO_05
"SD_FLG_N", // AON_GPIO_06
"-", // AON_GPIO_07
"2712_WAKE", // AON_GPIO_08
"2712_STAT_LED", // AON_GPIO_09
"-", // AON_GPIO_10
"-", // AON_GPIO_11
"PMIC_INT", // AON_GPIO_12
"UART_TX_FS", // AON_GPIO_13
"UART_RX_FS", // AON_GPIO_14
"-", // AON_GPIO_15
"-", // AON_GPIO_16
// Pad bank0 out to 32 entries
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"HDMI0_SCL", // AON_SGPIO_00
"HDMI0_SDA", // AON_SGPIO_01
"HDMI1_SCL", // AON_SGPIO_02
"HDMI1_SDA", // AON_SGPIO_03
"PMIC_SCL", // AON_SGPIO_04
"PMIC_SDA"; // AON_SGPIO_05
rp1_run_hog {
gpio-hog;
gpios = <2 GPIO_ACTIVE_HIGH>;
output-high;
line-name = "RP1 RUN pin";
};
};
&rp1_gpio {
gpio-line-names =
"ID_SDA", // GPIO0
"ID_SCL", // GPIO1
"GPIO2", // GPIO2
"GPIO3", // GPIO3
"GPIO4", // GPIO4
"GPIO5", // GPIO5
"GPIO6", // GPIO6
"GPIO7", // GPIO7
"GPIO8", // GPIO8
"GPIO9", // GPIO9
"GPIO10", // GPIO10
"GPIO11", // GPIO11
"GPIO12", // GPIO12
"GPIO13", // GPIO13
"GPIO14", // GPIO14
"GPIO15", // GPIO15
"GPIO16", // GPIO16
"GPIO17", // GPIO17
"GPIO18", // GPIO18
"GPIO19", // GPIO19
"GPIO20", // GPIO20
"GPIO21", // GPIO21
"GPIO22", // GPIO22
"GPIO23", // GPIO23
"GPIO24", // GPIO24
"GPIO25", // GPIO25
"GPIO26", // GPIO26
"GPIO27", // GPIO27
"PCIE_RP1_WAKE", // GPIO28
"FAN_TACH", // GPIO29
"HOST_SDA", // GPIO30
"HOST_SCL", // GPIO31
"ETH_RST_N", // GPIO32
"-", // GPIO33
"CD0_IO0_MICCLK", // GPIO34
"CD0_IO0_MICDAT0", // GPIO35
"RP1_PCIE_CLKREQ_N", // GPIO36
"-", // GPIO37
"CD0_SDA", // GPIO38
"CD0_SCL", // GPIO39
"CD1_SDA", // GPIO40
"CD1_SCL", // GPIO41
"USB_VBUS_EN", // GPIO42
"USB_OC_N", // GPIO43
"RP1_STAT_LED", // GPIO44
"FAN_PWM", // GPIO45
"CD1_IO0_MICCLK", // GPIO46
"2712_WAKE", // GPIO47
"CD1_IO1_MICDAT1", // GPIO48
"EN_MAX_USB_CUR", // GPIO49
"-", // GPIO50
"-", // GPIO51
"-", // GPIO52
"-"; // GPIO53
usb_vbus_pins: usb_vbus_pins {
function = "vbus1";
pins = "gpio42", "gpio43";
};
};
/ {
__overrides__ {
sd_cqe = <&sdio1>, "supports-cqe:0";
};
};
&hvs {
clocks = <&firmware_clocks 4>, <&firmware_clocks 16>;
clock-names = "core", "disp";
};
&hdmi0 {
clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 0>, <&clk_27MHz>;
clock-names = "hdmi", "bvb", "audio", "cec";
};
&hdmi1 {
clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 1>, <&clk_27MHz>;
clock-names = "hdmi", "bvb", "audio", "cec";
};
&soc {
firmware: firmware {
compatible = "raspberrypi,bcm2835-firmware", "simple-mfd";
#address-cells = <1>;
#size-cells = <1>;
mboxes = <&mailbox>;
dma-ranges;
firmware_clocks: clocks {
compatible = "raspberrypi,firmware-clocks";
#clock-cells = <1>;
};
reset: reset {
compatible = "raspberrypi,firmware-reset";
#reset-cells = <1>;
};
};
power: power {
compatible = "raspberrypi,bcm2835-power";
firmware = <&firmware>;
#power-domain-cells = <1>;
};
};
&hvs {
clocks = <&firmware_clocks 4>, <&firmware_clocks 16>;
clock-names = "core", "disp";
};
&hdmi0 {
clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 0>, <&clk_27MHz>;
clock-names = "hdmi", "bvb", "audio", "cec";
};
&hdmi1 {
clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 1>, <&clk_27MHz>;
clock-names = "hdmi", "bvb", "audio", "cec";
};
&pcie1 {
brcm,clkreq-mode = "safe";
};
&pcie2 {
status = "okay";
};