[PATCH 7/9] net: dwc_eth_qos: Add mediatek support

David Lechner dlechner at baylibre.com
Thu Apr 23 17:27:45 CEST 2026


On 4/23/26 8:25 AM, Julien Stephan wrote:
> Synopsys DWC Ethernet QOS device support for MediaTek SoCs.
> in particular this initial commit adds support for Genio 520/720 and
> Genio 510/700 EVKs
> 

...

> +#define RX_DELAY_MAX_PS			9800
> +#define TX_DELAY_MAX_PS			9800

Do we need two macros for the same value? Or can be DELAY_MAX_PS?

> +
> +#define OUT_OP				true
> +

...

> +static int mtk_set_interface(struct udevice *dev)
> +{
> +	struct eth_pdata *pdata = dev_get_plat(dev);
> +	struct eqos_mtk_priv *mtk_pdata = pdata->priv_pdata;
> +	int rmii_clk_from_mac = mtk_pdata->rmii_clk_from_mac ? EQOS_MTK_RMII_CLK_SRC_INTERNAL : 0;
> +	int rmii_rxc = mtk_pdata->rmii_rxc ? EQOS_MTK_RMII_CLK_SRC_RXC : 0;
> +	u32 intf_val = 0;
> +
> +	/* select phy interface in top control domain */
> +	switch (pdata->phy_interface) {
> +	case PHY_INTERFACE_MODE_MII:
> +		intf_val |= FIELD_PREP(EQOS_MTK_ETH_INTF_SEL, EQOS_MTK_PHY_INTF_MII);
> +		break;
> +	case PHY_INTERFACE_MODE_RMII:
> +		intf_val |= (rmii_rxc | rmii_clk_from_mac);
> +		intf_val |= FIELD_PREP(EQOS_MTK_ETH_INTF_SEL, EQOS_MTK_PHY_INTF_RMII);
> +		break;
> +	case PHY_INTERFACE_MODE_RGMII:
> +	case PHY_INTERFACE_MODE_RGMII_TXID:
> +	case PHY_INTERFACE_MODE_RGMII_RXID:
> +	case PHY_INTERFACE_MODE_RGMII_ID:
> +		intf_val |= FIELD_PREP(EQOS_MTK_ETH_INTF_SEL, EQOS_MTK_PHY_INTF_RGMII);
> +		break;
> +	default:
> +		pr_err("%s: dev=%p phy interface not supported\n", __func__, dev);
> +		return -EINVAL;
> +	}
> +
> +	/* only support external PHY */
> +	intf_val |= EQOS_MTK_EXT_PHY_MODE;
> +	if (OUT_OP)

OUT_OP is defined as true. Can we drop the macro and the condition?

> +		intf_val |= EQOS_MTK_TXC_OUT_OP;
> +
> +	regmap_write(mtk_pdata->peri_regmap, MT8189_PERI_ETH_CTRL0, intf_val);
> +
> +	return 0;
> +}
> +
> +static int mtk_config_dt(struct udevice *dev)
> +{	struct eth_pdata *pdata = dev_get_plat(dev);
> +	struct eqos_mtk_priv *mtk_pdata = pdata->priv_pdata;
> +	struct ofnode_phandle_args args;
> +	u32 tx_delay_ps, rx_delay_ps;
> +	int ret;
> +
> +	if (!dev_read_u32(dev, "mediatek,tx-delay-ps", &tx_delay_ps)) {
> +		if (tx_delay_ps > TX_DELAY_MAX_PS) {
> +			pr_err("%s: dev=%p Invalid TX clock delay: %dps\n",
> +			       __func__, dev, tx_delay_ps);
> +			return -EINVAL;
> +		}
> +	}
> +
> +	if (!dev_read_u32(dev, "mediatek,rx-delay-ps", &rx_delay_ps)) {
> +		if (rx_delay_ps > RX_DELAY_MAX_PS) {
> +			pr_err("%s: dev=%p Invalid RX clock delay: %dps\n",
> +			       __func__, dev, rx_delay_ps);
> +			return -EINVAL;
> +		}
> +	}
> +
> +	/* 290ps per stage */

Should we make a macro for that?

> +	mtk_pdata->tx_delay_ps_per_stage = tx_delay_ps / 290;
> +	mtk_pdata->rx_delay_ps_per_stage = rx_delay_ps / 290;

Doing demtional analysis, ps / (ps/stage) = stage.

So {tx,rx}_delay_ps_per_stage should just be stage units, not
ps_per_stage.

> +
> +	mtk_pdata->tx_inv = dev_read_bool(dev, "mediatek,txc-inverse");
> +	mtk_pdata->rx_inv = dev_read_bool(dev, "mediatek,rxc-inverse");
> +	mtk_pdata->rmii_clk_from_mac = dev_read_bool(dev, "mediatek,rmii-clk-from-mac");
> +	mtk_pdata->rmii_rxc = dev_read_bool(dev, "mediatek,rmii-rxc");
> +
> +	ret = dev_read_phandle_with_args(dev, "mediatek,pericfg", NULL, 0, 0, &args);
> +	if (ret) {
> +		pr_err("Failed to get mediatek,pericfg property: %d\n", ret);
> +		return ret;
> +	}
> +
> +	mtk_pdata->peri_regmap = syscon_node_to_regmap(args.node);
> +	if (IS_ERR(mtk_pdata->peri_regmap)) {
> +		pr_err("%s: dev=%p Invalid perif_cfg reg\n", __func__, dev);
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +


More information about the U-Boot mailing list