Message ID | 20211103020244.25428-8-kabel@kernel.org |
---|---|
State | Superseded |
Delegated to: | Stefan Roese |
Headers | show |
Series | Some mvebu comphy + mox + fdt_support changes | expand |
On 11/3/21 03:02, Marek Behún wrote: > 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> Reviewed-by: Stefan Roese <sr@denx.de> Thanks, Stefan > --- > 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; > > Viele Grüße, Stefan Roese
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;