From: "Marek Behún" <kabel@kernel.org>
To: Stefan Roese <sr@denx.de>
Cc: u-boot@lists.denx.de, "Pali Rohár" <pali@kernel.org>,
"Marek Behún" <marek.behun@nic.cz>
Subject: [PATCH u-boot-marvell 07/11] arm: mvebu: turris_mox: Find DT nodes by compatible or alias instead of path
Date: Wed, 3 Nov 2021 03:02:40 +0100 [thread overview]
Message-ID: <20211103020244.25428-8-kabel@kernel.org> (raw)
In-Reply-To: <20211103020244.25428-1-kabel@kernel.org>
From: Marek Behún <marek.behun@nic.cz>
It is better to find DT nodes by compatible strings or aliases instead
of path.
There were issues with Linux some DTBs having different names of some
nodes, e.g.
internal-regs
instead of
internal-regs@d0000000
This should be a generic fix for such issues.
Also since fdt_support now contains needed functions, we can drop our
own implementations.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
---
board/CZ.NIC/turris_mox/turris_mox.c | 186 +++++++++------------------
1 file changed, 63 insertions(+), 123 deletions(-)
diff --git a/board/CZ.NIC/turris_mox/turris_mox.c b/board/CZ.NIC/turris_mox/turris_mox.c
index 2202eb8cfb..03c923969e 100644
--- a/board/CZ.NIC/turris_mox/turris_mox.c
+++ b/board/CZ.NIC/turris_mox/turris_mox.c
@@ -41,22 +41,14 @@
#define ARMADA_37XX_SPI_DOUT (MVEBU_REGISTER(0x10608))
#define ARMADA_37XX_SPI_DIN (MVEBU_REGISTER(0x1060c))
-#define ETH1_PATH "/soc/internal-regs@d0000000/ethernet@40000"
-#define MDIO_PATH "/soc/internal-regs@d0000000/mdio@32004"
-#define SFP_GPIO_PATH "/soc/internal-regs@d0000000/spi@10600/moxtet@1/gpio@0"
-#define PCIE_PATH "/soc/pcie@d0070000"
-#define SFP_PATH "/sfp"
-#define LED_PATH "/leds/led"
-#define BUTTON_PATH "/gpio-keys/reset"
-
DECLARE_GLOBAL_DATA_PTR;
#if defined(CONFIG_OF_BOARD_FIXUP)
int board_fix_fdt(void *blob)
{
u8 topology[MAX_MOX_MODULES];
- int i, size, node;
- bool enable;
+ enum fdt_status status;
+ int i, size, ret;
/*
* SPI driver is not loaded in driver model yet, but we have to find out
@@ -94,21 +86,15 @@ int board_fix_fdt(void *blob)
if (size > 1 && (topology[1] == MOX_MODULE_PCI ||
topology[1] == MOX_MODULE_USB3 ||
topology[1] == MOX_MODULE_PASSPCI))
- enable = true;
+ status = FDT_STATUS_OKAY;
else
- enable = false;
-
- node = fdt_path_offset(blob, PCIE_PATH);
+ status = FDT_STATUS_DISABLED;
- if (node < 0) {
- printf("Cannot find PCIe node in U-Boot's device tree!\n");
- return 0;
- }
-
- if (fdt_setprop_string(blob, node, "status",
- enable ? "okay" : "disabled") < 0) {
- printf("Cannot %s PCIe in U-Boot's device tree!\n",
- enable ? "enable" : "disable");
+ ret = fdt_set_status_by_compatible(blob, "marvell,armada-3700-pcie",
+ status);
+ if (ret < 0) {
+ printf("Cannot set status for PCIe in U-Boot's device tree: %s!\n",
+ fdt_strerror(ret));
return 0;
}
@@ -416,12 +402,18 @@ static bool read_reset_button(void)
struct udevice *button, *led;
int i;
- if (device_get_global_by_ofnode(ofnode_path(BUTTON_PATH), &button)) {
+ if (device_get_global_by_ofnode(
+ ofnode_first_subnode(ofnode_by_compatible(ofnode_null(),
+ "gpio-keys")),
+ &button)) {
printf("Cannot find reset button!\n");
return false;
}
- if (device_get_global_by_ofnode(ofnode_path(LED_PATH), &led)) {
+ if (device_get_global_by_ofnode(
+ ofnode_first_subnode(ofnode_by_compatible(ofnode_null(),
+ "gpio-leds")),
+ &led)) {
printf("Cannot find status LED!\n");
return false;
}
@@ -664,92 +656,34 @@ handle_reset_btn:
#if defined(CONFIG_OF_BOARD_SETUP)
-static int vnode_by_path(void *blob, const char *fmt, va_list ap)
+static bool is_topaz(int id)
{
- char path[128];
-
- vsnprintf(path, 128, fmt, ap);
- return fdt_path_offset(blob, path);
+ return topaz && id == peridot + topaz - 1;
}
-static int node_by_path(void *blob, const char *fmt, ...)
+static int switch_addr(int id)
{
- va_list ap;
- int res;
-
- va_start(ap, fmt);
- res = vnode_by_path(blob, fmt, ap);
- va_end(ap);
-
- return res;
+ return is_topaz(id) ? 0x2 : 0x10 + id;
}
-static int phandle_by_path(void *blob, const char *fmt, ...)
+static int setup_switch(void *blob, int id)
{
- va_list ap;
- int node, phandle, res;
-
- va_start(ap, fmt);
- node = vnode_by_path(blob, fmt, ap);
- va_end(ap);
+ int res, addr, i, node;
+ char mdio_path[64];
+ node = fdt_node_offset_by_compatible(blob, -1, "marvell,orion-mdio");
if (node < 0)
return node;
- phandle = fdt_get_phandle(blob, node);
- if (phandle > 0)
- return phandle;
-
- phandle = fdt_get_max_phandle(blob);
- if (phandle < 0)
- return phandle;
-
- phandle += 1;
-
- res = fdt_setprop_u32(blob, node, "linux,phandle", phandle);
+ res = fdt_get_path(blob, node, mdio_path, sizeof(mdio_path));
if (res < 0)
return res;
- res = fdt_setprop_u32(blob, node, "phandle", phandle);
- if (res < 0)
- return res;
-
- return phandle;
-}
-
-static int enable_by_path(void *blob, const char *fmt, ...)
-{
- va_list ap;
- int node;
-
- va_start(ap, fmt);
- node = vnode_by_path(blob, fmt, ap);
- va_end(ap);
-
- if (node < 0)
- return node;
-
- return fdt_setprop_string(blob, node, "status", "okay");
-}
-
-static bool is_topaz(int id)
-{
- return topaz && id == peridot + topaz - 1;
-}
-
-static int switch_addr(int id)
-{
- return is_topaz(id) ? 0x2 : 0x10 + id;
-}
-
-static int setup_switch(void *blob, int id)
-{
- int res, addr, i, node, phandle;
-
addr = switch_addr(id);
/* first enable the switch by setting status = "okay" */
- res = enable_by_path(blob, MDIO_PATH "/switch%i@%x", id, addr);
+ res = fdt_status_okay_by_pathf(blob, "%s/switch%i@%x", mdio_path, id,
+ addr);
if (res < 0)
return res;
@@ -758,13 +692,13 @@ static int setup_switch(void *blob, int id)
* enable corresponding ports
*/
if (id < peridot + topaz - 1) {
- res = enable_by_path(blob,
- MDIO_PATH "/switch%i@%x/ports/port@a",
- id, addr);
+ res = fdt_status_okay_by_pathf(blob,
+ "%s/switch%i@%x/ports/port@a",
+ mdio_path, id, addr);
} else if (id == peridot - 1 && !topaz && sfp) {
- res = enable_by_path(blob,
- MDIO_PATH "/switch%i@%x/ports/port-sfp@a",
- id, addr);
+ res = fdt_status_okay_by_pathf(blob,
+ "%s/switch%i@%x/ports/port-sfp@a",
+ mdio_path, id, addr);
} else {
res = 0;
}
@@ -775,18 +709,21 @@ static int setup_switch(void *blob, int id)
return 0;
/* finally change link property if needed */
- node = node_by_path(blob, MDIO_PATH "/switch%i@%x/ports/port@a", id,
- addr);
+ node = fdt_node_offset_by_pathf(blob, "%s/switch%i@%x/ports/port@a",
+ mdio_path, id, addr);
if (node < 0)
return node;
for (i = id + 1; i < peridot + topaz; ++i) {
- phandle = phandle_by_path(blob,
- MDIO_PATH "/switch%i@%x/ports/port@%x",
- i, switch_addr(i),
- is_topaz(i) ? 5 : 9);
- if (phandle < 0)
- return phandle;
+ unsigned int phandle;
+
+ phandle = fdt_create_phandle_by_pathf(blob,
+ "%s/switch%i@%x/ports/port@%x",
+ mdio_path, i,
+ switch_addr(i),
+ is_topaz(i) ? 5 : 9);
+ if (!phandle)
+ return -FDT_ERR_NOPHANDLES;
if (i == id + 1)
res = fdt_setprop_u32(blob, node, "link", phandle);
@@ -819,18 +756,15 @@ static int remove_disabled_nodes(void *blob)
int ft_board_setup(void *blob, struct bd_info *bd)
{
- int node, phandle, res;
+ int res;
/*
* If MOX B (PCI), MOX F (USB) or MOX G (Passthrough PCI) modules are
* connected, enable the PCIe node.
*/
if (pci || usb || passpci) {
- node = fdt_path_offset(blob, PCIE_PATH);
- if (node < 0)
- return node;
-
- res = fdt_setprop_string(blob, node, "status", "okay");
+ res = fdt_status_okay_by_compatible(blob,
+ "marvell,armada-3700-pcie");
if (res < 0)
return res;
@@ -847,7 +781,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
if (peridot || topaz) {
int i;
- res = enable_by_path(blob, ETH1_PATH);
+ res = fdt_status_okay_by_alias(blob, "ethernet1");
if (res < 0)
return res;
@@ -865,20 +799,25 @@ int ft_board_setup(void *blob, struct bd_info *bd)
* Also enable and configure SFP GPIO controller node.
*/
if (sfp) {
- res = enable_by_path(blob, SFP_PATH);
+ int node;
+
+ res = fdt_status_okay_by_compatible(blob, "sff,sfp");
if (res < 0)
return res;
- res = enable_by_path(blob, ETH1_PATH);
+ res = fdt_status_okay_by_alias(blob, "ethernet1");
if (res < 0)
return res;
if (!peridot) {
- phandle = phandle_by_path(blob, SFP_PATH);
- if (phandle < 0)
- return res;
+ unsigned int phandle;
+
+ phandle = fdt_create_phandle_by_compatible(blob,
+ "sff,sfp");
+ if (!phandle)
+ return -FDT_ERR_NOPHANDLES;
- node = node_by_path(blob, ETH1_PATH);
+ node = fdt_path_offset(blob, "ethernet1");
if (node < 0)
return node;
@@ -892,7 +831,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
return res;
}
- res = enable_by_path(blob, SFP_GPIO_PATH);
+ res = fdt_status_okay_by_compatible(blob, "cznic,moxtet-gpio");
if (res < 0)
return res;
@@ -900,7 +839,8 @@ int ft_board_setup(void *blob, struct bd_info *bd)
char newname[16];
/* moxtet-sfp is on non-zero position, change default */
- node = node_by_path(blob, SFP_GPIO_PATH);
+ node = fdt_node_offset_by_compatible(blob, -1,
+ "cznic,moxtet-gpio");
if (node < 0)
return node;
--
2.32.0
next prev parent reply other threads:[~2021-11-03 2:04 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-03 2:02 [PATCH u-boot-marvell 00/11] Some mvebu comphy + mox + fdt_support changes Marek Behún
2021-11-03 2:02 ` [PATCH u-boot-marvell 01/11] include/linux/byteorder: Fix compilation of __constant_cpu_to_be32() Marek Behún
2021-11-12 12:40 ` Stefan Roese
2021-11-03 2:02 ` [PATCH u-boot-marvell 02/11] treewide: Use fdt_create_phandle() where appropriate Marek Behún
2021-11-12 12:40 ` Stefan Roese
2021-11-03 2:02 ` [PATCH u-boot-marvell 03/11] fdt_support: Remove fdt_alloc_phandle() in favor of fdt_generate_phandle() Marek Behún
2021-11-12 12:42 ` Stefan Roese
2021-11-12 17:26 ` Marek Behún
2021-11-03 2:02 ` [PATCH u-boot-marvell 04/11] fdt_support: Remove FDT_STATUS_FAIL_ERROR_CODE Marek Behún
2021-11-12 12:43 ` Stefan Roese
2021-11-03 2:02 ` [PATCH u-boot-marvell 05/11] fdt_support: Fix comment for fdt_create_phandle() Marek Behún
2021-11-12 12:44 ` Stefan Roese
2021-11-03 2:02 ` [PATCH u-boot-marvell 06/11] fdt_support: Add some useful functions Marek Behún
2021-11-12 13:14 ` Stefan Roese
2021-11-03 2:02 ` Marek Behún [this message]
2021-11-12 13:15 ` [PATCH u-boot-marvell 07/11] arm: mvebu: turris_mox: Find DT nodes by compatible or alias instead of path Stefan Roese
2021-11-03 2:02 ` [PATCH u-boot-marvell 08/11] arm: mvebu: turris_mox: Enable eth1 in U-Boot if a network module is present Marek Behún
2021-11-12 13:16 ` Stefan Roese
2021-11-03 2:02 ` [PATCH u-boot-marvell 09/11] phy: marvell: a3700: Convert to official DT bindings in COMPHY driver Marek Behún
2021-11-12 13:29 ` Stefan Roese
2021-11-12 17:27 ` Marek Behún
2021-11-15 6:47 ` Stefan Roese
2021-11-03 2:02 ` [PATCH u-boot-marvell 10/11] arm: mvebu: turris_mox: Fix unstable board topology reading Marek Behún
2021-11-12 13:30 ` Stefan Roese
2021-11-03 2:02 ` [PATCH u-boot-marvell 11/11] fdt_support: Add fdt_delete_disabled_nodes() and use in Turris MOX Marek Behún
2021-11-12 13:31 ` Stefan Roese
2021-11-11 15:36 ` [PATCH u-boot-marvell 00/11] Some mvebu comphy + mox + fdt_support changes Marek Behún
2021-11-12 9:49 ` Stefan Roese
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211103020244.25428-8-kabel@kernel.org \
--to=kabel@kernel.org \
--cc=marek.behun@nic.cz \
--cc=pali@kernel.org \
--cc=sr@denx.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox