Merge patch series "k3-am69-aquila: Migrate to OF_UPSTREAM and add remoteproc FW pre-loading"

Ernest Van Hoecke <ernestvanhoecke@gmail.com> says:

This patch series migrates the Aquila AM69 to OF_UPSTREAM to receive
automatic device tree updates. It also adds remoteproc firmware
pre-loading to the environment.

Link: https://lore.kernel.org/r/20260417-elb-6911-aquila69-ofupstr-v1-0-400d93db3747@toradex.com
This commit is contained in:
Tom Rini 2026-04-27 11:19:46 -06:00
commit b67f54885a
8 changed files with 26 additions and 2419 deletions

View File

@ -1079,8 +1079,7 @@ dtb-$(CONFIG_SOC_K3_J7200) += k3-j7200-r5-common-proc-board.dtb
dtb-$(CONFIG_SOC_K3_J721S2) += k3-am68-sk-r5-base-board.dtb\
k3-j721s2-r5-common-proc-board.dtb
dtb-$(CONFIG_SOC_K3_J784S4) += k3-am69-aquila-dev.dtb \
k3-am69-r5-aquila-dev.dtb \
dtb-$(CONFIG_SOC_K3_J784S4) += k3-am69-r5-aquila-dev.dtb \
k3-am69-r5-sk.dtb \
k3-j784s4-r5-evm.dtb

View File

@ -3,7 +3,7 @@
* Copyright (C) 2025 Toradex - https://www.toradex.com/
*/
#define SPL_BOARD_DTB "spl/dts/k3-am69-aquila-dev.dtb"
#define SPL_BOARD_DTB "spl/dts/ti/k3-am69-aquila-dev.dtb"
#define BOARD_DESCRIPTION "k3-am69-aquila"
#define UBOOT_BOARD_DESCRIPTION "U-Boot for AM69 Aquila board"

View File

@ -1,576 +0,0 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/*
* Copyright (C) 2025 Toradex
*
* https://www.toradex.com/computer-on-modules/aquila-arm-family/ti-am69
* https://www.toradex.com/products/carrier-board/aquila-development-board-kit
*/
/dts-v1/;
#include <dt-bindings/pwm/pwm.h>
#include "k3-am69-aquila.dtsi"
/ {
model = "Toradex Aquila AM69 on Aquila Development Board";
compatible = "toradex,aquila-am69-dev",
"toradex,aquila-am69",
"ti,j784s4";
aliases {
eeprom1 = &carrier_eeprom;
};
reg_1v8_sw: regulator-1v8-sw {
compatible = "regulator-fixed";
regulator-max-microvolt = <1800000>;
regulator-min-microvolt = <1800000>;
regulator-name = "Carrier_1V8";
};
reg_3v3_dp: regulator-3v3-dp {
compatible = "regulator-fixed";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_21_dp>;
/* Aquila GPIO_21_DP (AQUILA B57) */
gpio = <&main_gpio0 37 GPIO_ACTIVE_HIGH>;
enable-active-high;
regulator-max-microvolt = <3300000>;
regulator-min-microvolt = <3300000>;
regulator-name = "DP_3V3";
startup-delay-us = <10000>;
};
dp0-connector {
compatible = "dp-connector";
dp-pwr-supply = <&reg_3v3_dp>;
label = "Display Port";
type = "full-size";
port {
dp0_connector_in: endpoint {
remote-endpoint = <&dp0_out>;
};
};
};
sound {
compatible = "simple-audio-card";
simple-audio-card,bitclock-master = <&codec_dai>;
simple-audio-card,format = "i2s";
simple-audio-card,frame-master = <&codec_dai>;
simple-audio-card,name = "aquila-wm8904";
simple-audio-card,mclk-fs = <256>;
simple-audio-card,routing =
"Headphone Jack", "HPOUTL",
"Headphone Jack", "HPOUTR",
"IN2L", "Line In Jack",
"IN2R", "Line In Jack",
"Microphone Jack", "MICBIAS",
"IN1L", "Microphone Jack",
"IN1R", "Digital Mic";
simple-audio-card,widgets =
"Microphone", "Microphone Jack",
"Microphone", "Digital Mic",
"Headphone", "Headphone Jack",
"Line", "Line In Jack";
codec_dai: simple-audio-card,codec {
sound-dai = <&wm8904_1a>;
};
simple-audio-card,cpu {
sound-dai = <&mcasp4>;
};
};
};
/* Aquila CTRL_PWR_BTN_MICO# */
&aquila_key_power {
status = "okay";
};
/* Aquila CTRL_WAKE1_MICO# */
&aquila_key_wake {
status = "okay";
};
/* On-module ETH_1 MDIO */
&davinci_mdio {
status = "okay";
};
&dp0_ports {
port@4 {
reg = <4>;
dp0_out: endpoint {
remote-endpoint = <&dp0_connector_in>;
};
};
};
&dss {
status = "okay";
};
&main0_thermal {
cooling-maps {
map0 {
cooling-device = <&fan 1 1>;
trip = <&main0_alert0>;
};
map1 {
cooling-device = <&fan 2 2>;
trip = <&main0_alert1>;
};
};
};
&main1_thermal {
cooling-maps {
map0 {
cooling-device = <&fan 1 1>;
trip = <&main1_alert0>;
};
map1 {
cooling-device = <&fan 2 2>;
trip = <&main1_alert1>;
};
};
};
&main2_thermal {
cooling-maps {
map0 {
cooling-device = <&fan 1 1>;
trip = <&main2_alert0>;
};
map1 {
cooling-device = <&fan 2 2>;
trip = <&main2_alert1>;
};
};
};
&main3_thermal {
cooling-maps {
map0 {
cooling-device = <&fan 1 1>;
trip = <&main3_alert0>;
};
map1 {
cooling-device = <&fan 2 2>;
trip = <&main3_alert1>;
};
};
};
&main4_thermal {
cooling-maps {
map0 {
cooling-device = <&fan 1 1>;
trip = <&main4_alert0>;
};
map1 {
cooling-device = <&fan 2 2>;
trip = <&main4_alert1>;
};
};
};
/* Aquila ETH_2 */
&main_cpsw0 {
status = "okay";
};
/* Aquila ETH_2 SGMII PHY */
&main_cpsw0_port8 {
phy-handle = <&cpsw0_port8_phy4>;
status = "okay";
};
/* Aquila ETH_2_XGMII_MDIO */
&main_cpsw0_mdio {
status = "okay";
cpsw0_port8_phy4: ethernet-phy@4 {
reg = <4>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_eth2_int>;
interrupt-parent = <&main_gpio0>;
interrupts = <44 IRQ_TYPE_EDGE_FALLING>;
};
};
/* Aquila PWM_1 */
&main_ehrpwm0 {
status = "okay";
};
/* Aquila PWM_4_DP */
&main_ehrpwm2 {
status = "okay";
};
/* Aquila PWM_2 */
&main_ehrpwm1 {
status = "okay";
};
/* Aquila PWM_3_DSI */
&main_ehrpwm5 {
status = "okay";
};
&main_gpio0 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_01>, /* Aquila GPIO_01 */
<&pinctrl_gpio_02>, /* Aquila GPIO_02 */
<&pinctrl_gpio_03>; /* Aquila GPIO_03 */
};
/* Aquila I2C_3_DSI1 */
&main_i2c0 {
status = "okay";
i2c-mux@70 {
compatible = "nxp,pca9543";
reg = <0x70>;
#address-cells = <1>;
#size-cells = <0>;
/* I2C on DSI Connector Pin #4 and #6 */
i2c_dsi_0: i2c@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
};
/* I2C on DSI Connector Pin #52 and #54 */
i2c_dsi_1: i2c@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
};
};
};
/* Aquila I2C_4_CSI1 */
&main_i2c1 {
status = "okay";
};
/* Aquila I2C_5_CSI2 */
&main_i2c2 {
status = "okay";
};
/* Aquila I2C_6 */
&main_i2c5 {
status = "okay";
};
/* Aquila CAN_1 */
&main_mcan10 {
status = "okay";
};
/* Aquila CAN_3 */
&main_mcan13 {
status = "okay";
};
/* Aquila SD_1 */
&main_sdhci1 {
status = "okay";
};
/* Aquila SPI_2 */
&main_spi0 {
status = "okay";
};
/* Aquila SPI_1 */
&main_spi2 {
status = "okay";
};
/* Aquila UART_1 */
&main_uart4 {
status = "okay";
};
/* Aquila UART_3, used as the Linux console */
&main_uart8 {
status = "okay";
};
/* Aquila I2S_1 */
&mcasp4 {
status = "okay";
};
&mcu_cpsw {
status = "okay";
};
/* On-module ETH_1 RGMII */
&mcu_cpsw_port1 {
status = "okay";
};
/* Aquila I2C_1 */
&mcu_i2c0 {
clock-frequency = <100000>;
status = "okay";
fan_controller: fan@18 {
compatible = "ti,amc6821";
reg = <0x18>;
#pwm-cells = <2>;
fan: fan {
cooling-levels = <102 179 255>;
#cooling-cells = <2>;
pwms = <&fan_controller 40000 PWM_POLARITY_INVERTED>;
};
};
wm8904_1a: audio-codec@1a {
compatible = "wlf,wm8904";
reg = <0x1a>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_audio_extrefclk1>;
#sound-dai-cells = <0>;
clocks = <&audio_refclk1>;
clock-names = "mclk";
AVDD-supply = <&reg_1v8_sw>;
CPVDD-supply = <&reg_1v8_sw>;
DBVDD-supply = <&reg_1v8_sw>;
DCVDD-supply = <&reg_1v8_sw>;
MICVDD-supply = <&reg_1v8_sw>;
wlf,drc-cfg-names = "default", "peaklimiter";
/*
* Config registers per name, respectively:
* KNEE_IP = 0, KNEE_OP = 0, HI_COMP = 1, LO_COMP = 1
* KNEE_IP = -24, KNEE_OP = -6, HI_COMP = 1/4, LO_COMP = 1
*/
wlf,drc-cfg-regs = /bits/ 16 <0x01af 0x3248 0x0000 0x0000>,
/bits/ 16 <0x04af 0x324b 0x0010 0x0408>;
/* GPIO1 = DMIC_CLK, don't touch others */
wlf,gpio-cfg = <0x0018>, <0xffff>, <0xffff>, <0xffff>;
wlf,in1r-as-dmicdat2;
};
/* Current measurement into module VCC */
hwmon@41 {
compatible = "ti,ina226";
reg = <0x41>;
shunt-resistor = <5000>;
};
temperature-sensor@4f {
compatible = "ti,tmp1075";
reg = <0x4f>;
};
/* USB-C OTG (TCPC USB PD PHY) */
tcpc@52 {
compatible = "nxp,ptn5110", "tcpci";
reg = <0x52>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usb1_int>;
interrupt-parent = <&main_gpio0>;
interrupts = <28 IRQ_TYPE_EDGE_FALLING>;
connector {
compatible = "usb-c-connector";
data-role = "dual";
label = "USB-C OTG";
power-role = "dual";
try-power-role = "sink";
self-powered;
source-pdos = <PDO_FIXED(5000, 3000, PDO_FIXED_USB_COMM)>;
sink-pdos = <PDO_FIXED(5000, 3000, PDO_FIXED_USB_COMM)>;
op-sink-microwatt = <1000000>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
usb_1_con_hs: endpoint {
remote-endpoint = <&usb0_hs>;
};
};
port@1 {
reg = <1>;
usb_1_con_ss: endpoint {
remote-endpoint = <&usb0_ss_mux>;
};
};
};
};
};
carrier_eeprom: eeprom@57 {
compatible = "st,24c02", "atmel,24c02";
reg = <0x57>;
pagesize = <16>;
};
};
/* Aquila I2C_2 */
&mcu_i2c1 {
status = "okay";
};
/* Aquila CAN_2 */
&mcu_mcan0 {
status = "okay";
};
/* Aquila CAN_4 */
&mcu_mcan1 {
status = "okay";
};
/* Aquila UART_4 */
&mcu_uart0 {
status = "okay";
};
&mhdp {
status = "okay";
};
/* Aquila QSPI_1 */
&ospi0 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_mcu_ospi0_4bit>, <&pinctrl_mcu_ospi0_cs0>;
status = "okay";
flash@0 {
compatible = "jedec,spi-nor";
reg = <0x0>;
spi-max-frequency = <66000000>;
spi-rx-bus-width = <4>;
spi-tx-bus-width = <4>;
cdns,read-delay = <0>;
cdns,tchsh-ns = <3>;
cdns,tsd2d-ns = <10>;
cdns,tshsl-ns = <30>;
cdns,tslch-ns = <8>;
};
};
/* Aquila PCIE_1 */
&pcie0_rc {
status = "okay";
};
/* Aquila PCIE_2 */
&pcie1_rc {
status = "okay";
};
&serdes2 {
status = "okay";
};
&serdes4 {
status = "okay";
};
&serdes_wiz2 {
status = "okay";
};
&serdes_wiz4 {
status = "okay";
};
/* Aquila ADC_[1-4] */
&tscadc0 {
status = "okay";
};
&usbss0 {
status = "okay";
};
&usb0ss_mux {
status = "okay";
port {
usb0_ss_mux: endpoint {
remote-endpoint = <&usb_1_con_ss>;
};
};
};
&usb0 {
status = "okay";
port {
usb0_hs: endpoint {
remote-endpoint = <&usb_1_con_hs>;
};
};
};
&wkup0_thermal {
cooling-maps {
map0 {
cooling-device = <&fan 1 1>;
trip = <&wkup0_alert0>;
};
map1 {
cooling-device = <&fan 2 2>;
trip = <&wkup0_alert1>;
};
};
};
&wkup1_thermal {
cooling-maps {
map0 {
cooling-device = <&fan 1 1>;
trip = <&wkup1_alert0>;
};
map1 {
cooling-device = <&fan 2 2>;
trip = <&wkup1_alert1>;
};
};
};
&wkup_gpio0 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_04>, /* Aquila GPIO_04 */
<&pinctrl_gpio_05>, /* Aquila GPIO_05 */
<&pinctrl_gpio_06>, /* Aquila GPIO_06 */
<&pinctrl_gpio_07>, /* Aquila GPIO_07 */
<&pinctrl_gpio_08>; /* Aquila GPIO_08 */
};
/* Aquila UART_2, through RS485 transceiver */
&wkup_uart0 {
linux,rs485-enabled-at-boot-time;
rs485-rx-during-tx;
status = "okay";
};

File diff suppressed because it is too large Load Diff

View File

@ -14,6 +14,7 @@ config TARGET_AQUILA_AM69_A72
select ARM64
select SYS_DISABLE_DCACHE_OPS
select BINMAN
imply OF_UPSTREAM
config TARGET_AQUILA_AM69_R5
bool "Toradex Aquila AM69 running on R5"

View File

@ -3,9 +3,7 @@ M: Francesco Dolcini <francesco.dolcini@toradex.com>
W: https://www.toradex.com/computer-on-modules/aquila-arm-family/ti-am69
S: Maintained
F: arch/arm/dts/k3-am69-aquila-dev-u-boot.dtsi
F: arch/arm/dts/k3-am69-aquila-dev.dts
F: arch/arm/dts/k3-am69-aquila-lpddr4-4266.dtsi
F: arch/arm/dts/k3-am69-aquila.dtsi
F: arch/arm/dts/k3-am69-r5-aquila-dev.dts
F: board/toradex/aquila-am69
F: configs/aquila-am69_a72_defconfig

View File

@ -1,3 +1,5 @@
#include <env/ti/k3_rproc.env>
#define CFG_RAMDISK_ADDR_R 0x90300000
#define CFG_SCRIPTADDR 0x90280000
@ -39,3 +41,22 @@ update_uboot=
setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200;
mmc dev 0 1; mmc write ${loadaddr} 0x1400 ${blkcnt};
fi
rprocsemmcboot=
env set boot mmc;
env set bootpart 0:2;
rproc init;
run boot_rprocs_mmc;
env set bootpart;
rproc_fw_binaries= \
2 /lib/firmware/j784s4-main-r5f0_0-fw \
3 /lib/firmware/j784s4-main-r5f0_1-fw \
4 /lib/firmware/j784s4-main-r5f1_0-fw \
5 /lib/firmware/j784s4-main-r5f1_1-fw \
6 /lib/firmware/j784s4-main-r5f2_0-fw \
7 /lib/firmware/j784s4-main-r5f2_1-fw \
8 /lib/firmware/j784s4-c71_0-fw \
9 /lib/firmware/j784s4-c71_1-fw \
10 /lib/firmware/j784s4-c71_2-fw \
11 /lib/firmware/j784s4-c71_3-fw

View File

@ -11,7 +11,7 @@ CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x80480000
CONFIG_ENV_SIZE=0x2000
CONFIG_ENV_OFFSET=0xFFFFDE00
CONFIG_DM_GPIO=y
CONFIG_DEFAULT_DEVICE_TREE="k3-am69-aquila-dev"
CONFIG_DEFAULT_DEVICE_TREE="ti/k3-am69-aquila-dev"
CONFIG_OF_LIBFDT_OVERLAY=y
CONFIG_DM_RESET=y
CONFIG_SPL_MMC=y
@ -76,6 +76,7 @@ CONFIG_CMD_EXT4_WRITE=y
# CONFIG_SPL_EFI_PARTITION is not set
CONFIG_OF_CONTROL=y
CONFIG_SPL_OF_CONTROL=y
CONFIG_OF_UPSTREAM=y
CONFIG_SPL_MULTI_DTB_FIT=y
CONFIG_SPL_MULTI_DTB_FIT_NO_COMPRESSION=y
CONFIG_ENV_OVERWRITE=y