[PATCH v4 3/4] arm: kirkwood: Pogoplug-V4 : Add board implementation files

Pali Rohár pali at kernel.org
Fri Jan 21 11:00:54 CET 2022


On Thursday 20 January 2022 17:50:54 Tony Dinh wrote:
> diff --git a/board/cloudengines/pogo_v4/pogo_v4.c b/board/cloudengines/pogo_v4/pogo_v4.c
> new file mode 100644
> index 0000000000..c85de0b22e
> --- /dev/null
> +++ b/board/cloudengines/pogo_v4/pogo_v4.c
> +int fdt_get_phy_addr(const char *path)
> +{
> +	const void *fdt = gd->fdt_blob;
> +	const u32 *reg;
> +	const u32 *val;
> +	int node, phandle, addr;
> +
> +	/* Find the node by its full path */
> +	node = fdt_path_offset(fdt, path);
> +	if (node >= 0) {
> +		/* Look up phy-handle */
> +		val = fdt_getprop(fdt, node, "phy-handle", NULL);
> +		if (!val) {
> +			/* Look up phy (deprecated property for phy handle) */
> +			val = fdt_getprop(fdt, node, "phy", NULL);
> +		}
> +		if (val) {
> +			phandle = fdt32_to_cpu(*val);
> +			if (!phandle)
> +				return -FDT_ERR_NOTFOUND;
> +
> +			/* Follow it to its node */
> +			node = fdt_node_offset_by_phandle(fdt, phandle);
> +			if (node) {
> +				/* Look up reg */
> +				reg = fdt_getprop(fdt, node, "reg", NULL);
> +				if (reg) {
> +					addr = fdt32_to_cpu(*reg);
> +					return addr;
> +				}
> +			}
> +		}
> +	}
> +	return -FDT_ERR_NOTFOUND;
> +}
> +
> +#if defined(CONFIG_RESET_PHY_R)
> +/* Configure and initialize PHY */
> +void reset_phy(void)
> +{
> +	u16 reg;
> +	int phyaddr;
> +	char *name = "ethernet-controller at 72000";
> +	char *eth0_path = "/ocp at f1000000/ethernet-controller at 72000";

Hello! I would suggest to avoid hardcoding DT node names and DT node
paths into source code.

How to avoid it?

In DTS file define alias "ethernet0" as alias to eth0 node:

	aliases {
		ethernet0 = &eth0;
	};

(just before memory {} node)

&eth0 label is already defined in arch/arm/dts/kirkwood.dtsi.

Function fdt_path_offset() understands either full path or alias. So you
can call fdt_get_phy_addr("ethernet0").

And to get node name you can use function fdt_get_name() which takes
node offset - return value of fdt_path_offset().

And maybe... to avoid calling fdt_path_offset() two times, you may
adjust fdt_get_phy_addr() to directly take node offset (not path/alias).

So something like this:

    node = fdt_path_offset(gd->fdt_blob, "ethernet0");
    ... error checking ...
    name = fdt_get_name(gd->fdt_blob, node, NULL);
    ... error checking ...
    miiphy_set_current_dev(name);
    ... error checking ...
    fdt_get_phy_addr(node);
    ... error checking ...


> +	if (miiphy_set_current_dev(name))
> +		return;
> +
> +	phyaddr = fdt_get_phy_addr(eth0_path);
> +	if (phyaddr < 0)
> +		return;
> +
> +	/*
> +	 * Enable RGMII delay on Tx and Rx for CPU port
> +	 * Ref: sec 4.7.2 of chip datasheet
> +	 */
> +	miiphy_write(name, phyaddr, MV88E1116_PGADR_REG, 2);
> +	miiphy_read(name, phyaddr, MV88E1116_MAC_CTRL_REG, &reg);
> +	reg |= (MV88E1116_RGMII_RXTM_CTRL | MV88E1116_RGMII_TXTM_CTRL);
> +	miiphy_write(name, phyaddr, MV88E1116_MAC_CTRL_REG, reg);
> +	miiphy_write(name, phyaddr, MV88E1116_PGADR_REG, 0);
> +
> +	/* reset the phy */
> +	miiphy_reset(name, phyaddr);
> +
> +	printf("88E1116 Initialized on %s\n", name);
> +}


More information about the U-Boot mailing list