diff --git a/packages/tools/atf/package.mk b/packages/tools/atf/package.mk index 323488fa68..98689e9515 100644 --- a/packages/tools/atf/package.mk +++ b/packages/tools/atf/package.mk @@ -23,7 +23,7 @@ make_target() { if [ "${DEVICE}" = "iMX8" ]; then CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="--no-warn-rwx-segments" CFLAGS="--param=min-pagesize=0" make PLAT=${ATF_PLATFORM} bl31 else - CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="--no-warn-rwx-segments" CFLAGS="" make PLAT=${ATF_PLATFORM} bl31 + CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="--no-warn-rwx-segments" CFLAGS="" make SUNXI_SETUP_REGULATORS=0 PLAT=${ATF_PLATFORM} bl31 fi } diff --git a/projects/Allwinner/patches/atf/0001-HACK-Allwinner-Don-t-set-up-PMIC.patch b/projects/Allwinner/patches/atf/0001-HACK-Allwinner-Don-t-set-up-PMIC.patch deleted file mode 100644 index b7a8534964..0000000000 --- a/projects/Allwinner/patches/atf/0001-HACK-Allwinner-Don-t-set-up-PMIC.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Sat, 8 Oct 2022 10:40:12 +0200 -Subject: [PATCH] HACK: Allwinner: Don't set up PMIC - -There are two issues: -1. Regulators must be bring up in certain order with delays between - steps which are not considered here. -2. PMIC setup fails on board without PMIC, like Tanix TX6. - -Since LibreELEC doesn't need things that need additional regulators to -be set up in U-Boot like networking, disable PMIC completely in order to -avoid above issues. - -Signed-off-by: Jernej Skrabec ---- - plat/allwinner/common/sunxi_bl31_setup.c | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/plat/allwinner/common/sunxi_bl31_setup.c b/plat/allwinner/common/sunxi_bl31_setup.c -index a32124a182a8..34a68dd80e70 100644 ---- a/plat/allwinner/common/sunxi_bl31_setup.c -+++ b/plat/allwinner/common/sunxi_bl31_setup.c -@@ -177,8 +177,6 @@ void bl31_platform_setup(void) - if (soc_id == SUNXI_SOC_A64 || soc_id == SUNXI_SOC_H5) - mmio_write_32(SUNXI_CCU_BASE + 0x5c, 0x1); - -- sunxi_pmic_setup(soc_id, fdt); -- - INFO("BL31: Platform setup done\n"); - } - diff --git a/projects/Allwinner/patches/atf/0001-refactor-fdt-introduce-common-fdt_node_is_enabled.patch b/projects/Allwinner/patches/atf/0001-refactor-fdt-introduce-common-fdt_node_is_enabled.patch new file mode 100644 index 0000000000..12a321b589 --- /dev/null +++ b/projects/Allwinner/patches/atf/0001-refactor-fdt-introduce-common-fdt_node_is_enabled.patch @@ -0,0 +1,84 @@ +From 49b268ce3036b2645c3a0caeaefb625f7a2d5982 Mon Sep 17 00:00:00 2001 +From: Andre Przywara +Date: Fri, 3 Feb 2023 11:11:18 +0000 +Subject: [PATCH] refactor(fdt): introduce common fdt_node_is_enabled() + +There are several users in the tree which want to check whether a given +FDT node is enabled or not: the "status" property holds that +information. So far all those users provide private implementations, +some of them having issues. + +Export a generic implementation of that function in fdt_wrappers.h, as +a "static inline" function to not increase code size. +Also replace the existing implementation in Arm's fconf code, which had +a tiny bug in needlessly using the property length: +"status = [6f 6b 61 79 20];" would pass the check, where it should not. +The proper solution is also simpler: status must be a string, and +strings must be NUL-terminated in a DT. strcmp() would terminate on the +first NUL in *either* of the two strings it compares, so it would never +walk beyond the property boundary in the DTB. + +Change-Id: I9d89093432f127c09add6cf5c93a725bc534e5de +Signed-off-by: Andre Przywara +--- + include/common/fdt_wrappers.h | 10 ++++++++++ + plat/arm/common/fconf/fconf_ethosn_getter.c | 15 --------------- + 2 files changed, 10 insertions(+), 15 deletions(-) + +diff --git a/include/common/fdt_wrappers.h b/include/common/fdt_wrappers.h +index 2929fc23d5bb..b16510f3d971 100644 +--- a/include/common/fdt_wrappers.h ++++ b/include/common/fdt_wrappers.h +@@ -10,6 +10,7 @@ + #define FDT_WRAPPERS_H + + #include ++#include + + /* Number of cells, given total length in bytes. Each cell is 4 bytes long */ + #define NCELLS(len) ((len) / 4U) +@@ -53,6 +54,15 @@ static inline uint32_t fdt_blob_size(const void *dtb) + return fdt32_to_cpu(dtb_header[1]); + } + ++static inline bool fdt_node_is_enabled(const void *fdt, int node) ++{ ++ int len; ++ const void *prop = fdt_getprop(fdt, node, "status", &len); ++ ++ /* A non-existing status property means the device is enabled. */ ++ return (prop == NULL) || (len == 5 && strcmp(prop, "okay") == 0); ++} ++ + #define fdt_for_each_compatible_node(dtb, node, compatible_str) \ + for (node = fdt_node_offset_by_compatible(dtb, -1, compatible_str); \ + node >= 0; \ +diff --git a/plat/arm/common/fconf/fconf_ethosn_getter.c b/plat/arm/common/fconf/fconf_ethosn_getter.c +index 0b48a9816338..251471e63b6a 100644 +--- a/plat/arm/common/fconf/fconf_ethosn_getter.c ++++ b/plat/arm/common/fconf/fconf_ethosn_getter.c +@@ -20,21 +20,6 @@ struct ethosn_sub_allocator_t { + uint32_t stream_id; + }; + +-static bool fdt_node_is_enabled(const void *fdt, int node) +-{ +- int len; +- const char *node_status; +- +- node_status = fdt_getprop(fdt, node, "status", &len); +- if (node_status == NULL || +- (len == 5 && /* Includes null character */ +- strncmp(node_status, "okay", 4U) == 0)) { +- return true; +- } +- +- return false; +-} +- + static bool fdt_node_has_reserved_memory(const void *fdt, int dev_node) + { + return fdt_get_property(fdt, dev_node, "memory-region", NULL) != NULL; +-- +2.39.1 + diff --git a/projects/Allwinner/patches/atf/0002-fix-allwinner-check-RSB-availability-in-DT-on-H6.patch b/projects/Allwinner/patches/atf/0002-fix-allwinner-check-RSB-availability-in-DT-on-H6.patch new file mode 100644 index 0000000000..61d0064a05 --- /dev/null +++ b/projects/Allwinner/patches/atf/0002-fix-allwinner-check-RSB-availability-in-DT-on-H6.patch @@ -0,0 +1,53 @@ +From 8168cbaf31c876e20197dd3c5401292e24e8ae80 Mon Sep 17 00:00:00 2001 +From: Andre Przywara +Date: Wed, 1 Feb 2023 22:28:37 +0000 +Subject: [PATCH] fix(allwinner): check RSB availability in DT on H6 + +At the moment we access the RSB bus on all Allwinner H6 boards +unconditionally, even though some boards do not have any PMIC at all, +while others have some I2C devices connected to the same pins. +The latter case is just fragile, but the first case leads to a hang on +at least one board, as reported by Jernej. + +Scan the devicetree, to check for the availability of the RSB bus node. +Proceed only if the RSB DT node is actually enabled. + +Change-Id: Iea7dcfe3e085e173334d098ec4ddcb6c4b085771 +Signed-off-by: Andre Przywara +Reported-by: Jernej Skrabec +--- + plat/allwinner/sun50i_h6/sunxi_power.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/plat/allwinner/sun50i_h6/sunxi_power.c b/plat/allwinner/sun50i_h6/sunxi_power.c +index d298e6b8adaf..1257076dfd1b 100644 +--- a/plat/allwinner/sun50i_h6/sunxi_power.c ++++ b/plat/allwinner/sun50i_h6/sunxi_power.c +@@ -8,8 +8,10 @@ + #include + + #include ++#include + #include + #include ++#include + #include + + #include +@@ -63,7 +65,12 @@ static int rsb_init(void) + + int sunxi_pmic_setup(uint16_t socid, const void *fdt) + { +- int ret; ++ int node, ret; ++ ++ node = fdt_node_offset_by_compatible(fdt, 0, "allwinner,sun8i-a23-rsb"); ++ if ((node < 0) || !fdt_node_is_enabled(fdt, node)) { ++ return -ENODEV; ++ } + + INFO("PMIC: Probing AXP805 on RSB\n"); + +-- +2.39.1 + diff --git a/projects/Allwinner/patches/linux/0077-OrangePi-3-LTS-support.patch b/projects/Allwinner/patches/linux/0077-OrangePi-3-LTS-support.patch index 3bb1cd946c..d46cf5157c 100644 --- a/projects/Allwinner/patches/linux/0077-OrangePi-3-LTS-support.patch +++ b/projects/Allwinner/patches/linux/0077-OrangePi-3-LTS-support.patch @@ -1,13 +1,13 @@ -From 6f4abbea26de4ef963e9edd8eb051f5e7f2e0c6c Mon Sep 17 00:00:00 2001 +From 72b6fa8ce7faa765ad0aa0491f9f4a907107b80e Mon Sep 17 00:00:00 2001 From: Jernej Skrabec -Date: Mon, 2 Jan 2023 15:49:59 +0100 +Date: Sun, 29 Jan 2023 22:19:45 +0100 Subject: [PATCH] OrangePi 3 LTS support Signed-off-by: Jernej Skrabec --- - arch/arm64/boot/dts/allwinner/Makefile | 1 + - .../allwinner/sun50i-h6-orangepi-3-lts.dts | 26 +++++++++++++++++++ - 2 files changed, 27 insertions(+) + arch/arm64/boot/dts/allwinner/Makefile | 1 + + .../allwinner/sun50i-h6-orangepi-3-lts.dts | 313 ++++++++++++++++++ + 2 files changed, 314 insertions(+) create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile @@ -24,36 +24,323 @@ index 6a96494a2e0a..ace8159a6324 100644 dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-pine-h64.dtb diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts new file mode 100644 -index 000000000000..0e490936b50c +index 000000000000..6a5df1103a90 --- /dev/null +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts -@@ -0,0 +1,26 @@ +@@ -0,0 +1,313 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +// Copyright (C) 2023 Jernej Skrabec ++// Based on sun50i-h6-orangepi-3.dts, which is: ++// Copyright (C) 2019 Ondřej Jirman + -+#include "sun50i-h6-orangepi-3.dts" ++/dts-v1/; ++ ++#include "sun50i-h6.dtsi" ++#include "sun50i-h6-cpu-opp.dtsi" ++ ++#include + +/ { + model = "OrangePi 3 LTS"; + compatible = "xunlong,orangepi-3-lts", "allwinner,sun50i-h6"; ++ ++ aliases { ++ ethernet0 = &emac; ++ serial0 = &uart0; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++ ++ connector { ++ compatible = "hdmi-connector"; ++ ddc-en-gpios = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */ ++ type = "a"; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ ++ ext_osc32k: ext_osc32k_clk { ++ #clock-cells = <0>; ++ compatible = "fixed-clock"; ++ clock-frequency = <32768>; ++ clock-output-names = "ext_osc32k"; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ ++ led-0 { ++ label = "orangepi:red:power"; ++ gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ ++ default-state = "on"; ++ }; ++ ++ led-1 { ++ label = "orangepi:green:status"; ++ gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */ ++ }; ++ }; ++ ++ reg_gmac_3v3: gmac-3v3 { ++ compatible = "regulator-fixed"; ++ regulator-name = "gmac-3v3"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ startup-delay-us = <150000>; ++ enable-active-high; ++ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */ ++ }; ++ ++ reg_vcc5v: vcc5v { ++ /* board wide 5V supply directly from the DC jack */ ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc-5v"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ regulator-always-on; ++ }; ++}; ++ ++&cpu0 { ++ cpu-supply = <®_dcdca>; ++}; ++ ++&de { ++ status = "okay"; ++}; ++ ++&dwc3 { ++ status = "okay"; ++}; ++ ++&ehci0 { ++ status = "okay"; ++}; ++ ++&ehci3 { ++ status = "okay"; +}; + +&emac { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&ext_rgmii_pins>; ++ phy-mode = "rgmii"; ++ phy-handle = <&ext_rgmii_phy>; ++ phy-supply = <®_gmac_3v3>; + allwinner,rx-delay-ps = <200>; + allwinner,tx-delay-ps = <300>; ++ status = "okay"; +}; + -+&mmc1 { -+ status = "disabled"; ++&gpu { ++ mali-supply = <®_dcdcc>; ++ status = "okay"; +}; + -+&r_rsb { -+ clock-frequency = <100000>; ++&hdmi { ++ hvcc-supply = <®_bldo2>; ++ status = "okay"; +}; + -+&uart1 { -+ status = "disabled"; ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ ++&mdio { ++ ext_rgmii_phy: ethernet-phy@1 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <1>; ++ ++ reset-gpios = <&pio 3 14 GPIO_ACTIVE_LOW>; /* PD14 */ ++ reset-assert-us = <15000>; ++ reset-deassert-us = <40000>; ++ }; ++}; ++ ++&mmc0 { ++ vmmc-supply = <®_cldo1>; ++ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */ ++ bus-width = <4>; ++ status = "okay"; ++}; ++ ++&mmc2 { ++ vmmc-supply = <®_cldo1>; ++ vqmmc-supply = <®_bldo2>; ++ cap-mmc-hw-reset; ++ non-removable; ++ bus-width = <8>; ++ status = "okay"; ++}; ++ ++&ohci0 { ++ status = "okay"; ++}; ++ ++&ohci3 { ++ status = "okay"; ++}; ++ ++&pio { ++ vcc-pc-supply = <®_bldo2>; ++ vcc-pd-supply = <®_cldo1>; ++ vcc-pg-supply = <®_bldo3>; ++}; ++ ++&r_ir { ++ status = "okay"; ++}; ++ ++&r_i2c { ++ status = "okay"; ++ ++ axp805: pmic@36 { ++ compatible = "x-powers,axp805", "x-powers,axp806"; ++ reg = <0x36>; ++ interrupt-parent = <&r_intc>; ++ interrupts = ; ++ interrupt-controller; ++ #interrupt-cells = <1>; ++ x-powers,self-working-mode; ++ vina-supply = <®_vcc5v>; ++ vinb-supply = <®_vcc5v>; ++ vinc-supply = <®_vcc5v>; ++ vind-supply = <®_vcc5v>; ++ vine-supply = <®_vcc5v>; ++ aldoin-supply = <®_vcc5v>; ++ bldoin-supply = <®_vcc5v>; ++ cldoin-supply = <®_vcc5v>; ++ ++ regulators { ++ reg_aldo1: aldo1 { ++ regulator-always-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc-pl-led-ir"; ++ }; ++ ++ reg_aldo2: aldo2 { ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc33-audio-tv-ephy-mac"; ++ }; ++ ++ /* ALDO3 is shorted to CLDO1 */ ++ reg_aldo3: aldo3 { ++ regulator-always-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc33-io-pd-emmc-sd-usb-uart-1"; ++ }; ++ ++ reg_bldo1: bldo1 { ++ regulator-always-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc18-dram-bias-pll"; ++ }; ++ ++ reg_bldo2: bldo2 { ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc-efuse-pcie-hdmi-pc"; ++ }; ++ ++ reg_bldo3: bldo3 { ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc-pm-pg-dcxoio-wifi"; ++ }; ++ ++ bldo4 { ++ /* unused */ ++ }; ++ ++ reg_cldo1: cldo1 { ++ regulator-always-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc33-io-pd-emmc-sd-usb-uart-2"; ++ }; ++ ++ cldo2 { ++ /* unused */ ++ }; ++ ++ cldo3 { ++ /* unused */ ++ }; ++ ++ reg_dcdca: dcdca { ++ regulator-always-on; ++ regulator-min-microvolt = <800000>; ++ regulator-max-microvolt = <1160000>; ++ regulator-ramp-delay = <2500>; ++ regulator-name = "vdd-cpu"; ++ }; ++ ++ reg_dcdcc: dcdcc { ++ regulator-enable-ramp-delay = <32000>; ++ regulator-min-microvolt = <810000>; ++ regulator-max-microvolt = <1080000>; ++ regulator-ramp-delay = <2500>; ++ regulator-name = "vdd-gpu"; ++ }; ++ ++ reg_dcdcd: dcdcd { ++ regulator-always-on; ++ regulator-min-microvolt = <960000>; ++ regulator-max-microvolt = <960000>; ++ regulator-name = "vdd-sys"; ++ }; ++ ++ reg_dcdce: dcdce { ++ regulator-always-on; ++ regulator-min-microvolt = <1200000>; ++ regulator-max-microvolt = <1200000>; ++ regulator-name = "vcc-dram"; ++ }; ++ ++ sw { ++ /* unused */ ++ }; ++ }; ++ }; ++}; ++ ++&rtc { ++ clocks = <&ext_osc32k>; ++}; ++ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_ph_pins>; ++ status = "okay"; ++}; ++ ++&usb2otg { ++ dr_mode = "host"; ++ status = "okay"; ++}; ++ ++&usb2phy { ++ usb0_id_det-gpios = <&pio 2 15 GPIO_ACTIVE_HIGH>; /* PC15 */ ++ usb0_vbus-supply = <®_vcc5v>; ++ usb3_vbus-supply = <®_vcc5v>; ++ status = "okay"; ++}; ++ ++&usb3phy { ++ status = "okay"; +}; -- -2.39.0 +2.39.1 diff --git a/projects/Allwinner/patches/u-boot/0010-sunxi-Add-OrangePi-3-LTS-board.patch b/projects/Allwinner/patches/u-boot/0010-sunxi-Add-OrangePi-3-LTS-board.patch new file mode 100644 index 0000000000..6afd6f7a59 --- /dev/null +++ b/projects/Allwinner/patches/u-boot/0010-sunxi-Add-OrangePi-3-LTS-board.patch @@ -0,0 +1,373 @@ +From 65a3bafb3f5a8c83b678b59cb4b7bb87d12e7cd0 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Tue, 7 Feb 2023 17:43:14 +0100 +Subject: [PATCH] sunxi: Add OrangePi 3 LTS board + +Signed-off-by: Jernej Skrabec +--- + arch/arm/dts/Makefile | 1 + + arch/arm/dts/sun50i-h6-orangepi-3-lts.dts | 313 ++++++++++++++++++++++ + configs/orangepi_3_lts_defconfig | 19 ++ + 3 files changed, 333 insertions(+) + create mode 100644 arch/arm/dts/sun50i-h6-orangepi-3-lts.dts + create mode 100644 configs/orangepi_3_lts_defconfig + +diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile +index 965895bc2a3c..501400635fa9 100644 +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -702,6 +702,7 @@ dtb-$(CONFIG_MACH_SUN50I_H5) += \ + dtb-$(CONFIG_MACH_SUN50I_H6) += \ + sun50i-h6-beelink-gs1.dtb \ + sun50i-h6-orangepi-3.dtb \ ++ sun50i-h6-orangepi-3-lts.dtb \ + sun50i-h6-orangepi-lite2.dtb \ + sun50i-h6-orangepi-one-plus.dtb \ + sun50i-h6-pine-h64.dtb \ +diff --git a/arch/arm/dts/sun50i-h6-orangepi-3-lts.dts b/arch/arm/dts/sun50i-h6-orangepi-3-lts.dts +new file mode 100644 +index 000000000000..6a5df1103a90 +--- /dev/null ++++ b/arch/arm/dts/sun50i-h6-orangepi-3-lts.dts +@@ -0,0 +1,313 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++// Copyright (C) 2023 Jernej Skrabec ++// Based on sun50i-h6-orangepi-3.dts, which is: ++// Copyright (C) 2019 Ondřej Jirman ++ ++/dts-v1/; ++ ++#include "sun50i-h6.dtsi" ++#include "sun50i-h6-cpu-opp.dtsi" ++ ++#include ++ ++/ { ++ model = "OrangePi 3 LTS"; ++ compatible = "xunlong,orangepi-3-lts", "allwinner,sun50i-h6"; ++ ++ aliases { ++ ethernet0 = &emac; ++ serial0 = &uart0; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++ ++ connector { ++ compatible = "hdmi-connector"; ++ ddc-en-gpios = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */ ++ type = "a"; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ ++ ext_osc32k: ext_osc32k_clk { ++ #clock-cells = <0>; ++ compatible = "fixed-clock"; ++ clock-frequency = <32768>; ++ clock-output-names = "ext_osc32k"; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ ++ led-0 { ++ label = "orangepi:red:power"; ++ gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ ++ default-state = "on"; ++ }; ++ ++ led-1 { ++ label = "orangepi:green:status"; ++ gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */ ++ }; ++ }; ++ ++ reg_gmac_3v3: gmac-3v3 { ++ compatible = "regulator-fixed"; ++ regulator-name = "gmac-3v3"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ startup-delay-us = <150000>; ++ enable-active-high; ++ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */ ++ }; ++ ++ reg_vcc5v: vcc5v { ++ /* board wide 5V supply directly from the DC jack */ ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc-5v"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ regulator-always-on; ++ }; ++}; ++ ++&cpu0 { ++ cpu-supply = <®_dcdca>; ++}; ++ ++&de { ++ status = "okay"; ++}; ++ ++&dwc3 { ++ status = "okay"; ++}; ++ ++&ehci0 { ++ status = "okay"; ++}; ++ ++&ehci3 { ++ status = "okay"; ++}; ++ ++&emac { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&ext_rgmii_pins>; ++ phy-mode = "rgmii"; ++ phy-handle = <&ext_rgmii_phy>; ++ phy-supply = <®_gmac_3v3>; ++ allwinner,rx-delay-ps = <200>; ++ allwinner,tx-delay-ps = <300>; ++ status = "okay"; ++}; ++ ++&gpu { ++ mali-supply = <®_dcdcc>; ++ status = "okay"; ++}; ++ ++&hdmi { ++ hvcc-supply = <®_bldo2>; ++ status = "okay"; ++}; ++ ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ ++&mdio { ++ ext_rgmii_phy: ethernet-phy@1 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <1>; ++ ++ reset-gpios = <&pio 3 14 GPIO_ACTIVE_LOW>; /* PD14 */ ++ reset-assert-us = <15000>; ++ reset-deassert-us = <40000>; ++ }; ++}; ++ ++&mmc0 { ++ vmmc-supply = <®_cldo1>; ++ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */ ++ bus-width = <4>; ++ status = "okay"; ++}; ++ ++&mmc2 { ++ vmmc-supply = <®_cldo1>; ++ vqmmc-supply = <®_bldo2>; ++ cap-mmc-hw-reset; ++ non-removable; ++ bus-width = <8>; ++ status = "okay"; ++}; ++ ++&ohci0 { ++ status = "okay"; ++}; ++ ++&ohci3 { ++ status = "okay"; ++}; ++ ++&pio { ++ vcc-pc-supply = <®_bldo2>; ++ vcc-pd-supply = <®_cldo1>; ++ vcc-pg-supply = <®_bldo3>; ++}; ++ ++&r_ir { ++ status = "okay"; ++}; ++ ++&r_i2c { ++ status = "okay"; ++ ++ axp805: pmic@36 { ++ compatible = "x-powers,axp805", "x-powers,axp806"; ++ reg = <0x36>; ++ interrupt-parent = <&r_intc>; ++ interrupts = ; ++ interrupt-controller; ++ #interrupt-cells = <1>; ++ x-powers,self-working-mode; ++ vina-supply = <®_vcc5v>; ++ vinb-supply = <®_vcc5v>; ++ vinc-supply = <®_vcc5v>; ++ vind-supply = <®_vcc5v>; ++ vine-supply = <®_vcc5v>; ++ aldoin-supply = <®_vcc5v>; ++ bldoin-supply = <®_vcc5v>; ++ cldoin-supply = <®_vcc5v>; ++ ++ regulators { ++ reg_aldo1: aldo1 { ++ regulator-always-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc-pl-led-ir"; ++ }; ++ ++ reg_aldo2: aldo2 { ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc33-audio-tv-ephy-mac"; ++ }; ++ ++ /* ALDO3 is shorted to CLDO1 */ ++ reg_aldo3: aldo3 { ++ regulator-always-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc33-io-pd-emmc-sd-usb-uart-1"; ++ }; ++ ++ reg_bldo1: bldo1 { ++ regulator-always-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc18-dram-bias-pll"; ++ }; ++ ++ reg_bldo2: bldo2 { ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc-efuse-pcie-hdmi-pc"; ++ }; ++ ++ reg_bldo3: bldo3 { ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc-pm-pg-dcxoio-wifi"; ++ }; ++ ++ bldo4 { ++ /* unused */ ++ }; ++ ++ reg_cldo1: cldo1 { ++ regulator-always-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc33-io-pd-emmc-sd-usb-uart-2"; ++ }; ++ ++ cldo2 { ++ /* unused */ ++ }; ++ ++ cldo3 { ++ /* unused */ ++ }; ++ ++ reg_dcdca: dcdca { ++ regulator-always-on; ++ regulator-min-microvolt = <800000>; ++ regulator-max-microvolt = <1160000>; ++ regulator-ramp-delay = <2500>; ++ regulator-name = "vdd-cpu"; ++ }; ++ ++ reg_dcdcc: dcdcc { ++ regulator-enable-ramp-delay = <32000>; ++ regulator-min-microvolt = <810000>; ++ regulator-max-microvolt = <1080000>; ++ regulator-ramp-delay = <2500>; ++ regulator-name = "vdd-gpu"; ++ }; ++ ++ reg_dcdcd: dcdcd { ++ regulator-always-on; ++ regulator-min-microvolt = <960000>; ++ regulator-max-microvolt = <960000>; ++ regulator-name = "vdd-sys"; ++ }; ++ ++ reg_dcdce: dcdce { ++ regulator-always-on; ++ regulator-min-microvolt = <1200000>; ++ regulator-max-microvolt = <1200000>; ++ regulator-name = "vcc-dram"; ++ }; ++ ++ sw { ++ /* unused */ ++ }; ++ }; ++ }; ++}; ++ ++&rtc { ++ clocks = <&ext_osc32k>; ++}; ++ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_ph_pins>; ++ status = "okay"; ++}; ++ ++&usb2otg { ++ dr_mode = "host"; ++ status = "okay"; ++}; ++ ++&usb2phy { ++ usb0_id_det-gpios = <&pio 2 15 GPIO_ACTIVE_HIGH>; /* PC15 */ ++ usb0_vbus-supply = <®_vcc5v>; ++ usb3_vbus-supply = <®_vcc5v>; ++ status = "okay"; ++}; ++ ++&usb3phy { ++ status = "okay"; ++}; +diff --git a/configs/orangepi_3_lts_defconfig b/configs/orangepi_3_lts_defconfig +new file mode 100644 +index 000000000000..41a9af4ef67a +--- /dev/null ++++ b/configs/orangepi_3_lts_defconfig +@@ -0,0 +1,19 @@ ++CONFIG_ARM=y ++CONFIG_ARCH_SUNXI=y ++CONFIG_DEFAULT_DEVICE_TREE="sun50i-h6-orangepi-3-lts" ++CONFIG_SPL=y ++CONFIG_MACH_SUN50I_H6=y ++CONFIG_SUNXI_DRAM_H6_LPDDR3=y ++CONFIG_MMC0_CD_PIN="PF6" ++CONFIG_MMC_SUNXI_SLOT_EXTRA=2 ++# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set ++CONFIG_SPL_STACK=0x118000 ++CONFIG_SYS_PBSIZE=1024 ++CONFIG_SYS_BOOTM_LEN=0x2000000 ++CONFIG_PHY_SUN50I_USB3=y ++CONFIG_USB_XHCI_HCD=y ++CONFIG_USB_XHCI_DWC3=y ++CONFIG_USB_EHCI_HCD=y ++CONFIG_USB_OHCI_HCD=y ++CONFIG_USB_DWC3=y ++# CONFIG_USB_DWC3_GADGET is not set +-- +2.39.1 + diff --git a/scripts/uboot_helper b/scripts/uboot_helper index 9cb2499e2f..4cf6e4ca11 100755 --- a/scripts/uboot_helper +++ b/scripts/uboot_helper @@ -122,8 +122,8 @@ devices = \ }, 'orangepi-3-lts': { 'dtb': 'sun50i-h6-orangepi-3-lts.dtb', - 'config': 'orangepi_3_defconfig', - 'crust_config': 'orangepi_3_defconfig' + 'config': 'orangepi_3_lts_defconfig', + 'crust_config': 'pine_h64_defconfig' }, 'orangepi-lite2': { 'dtb': 'sun50i-h6-orangepi-lite2.dtb',