[PATCH v2 6/9] net: phy: Add airoha AN8801 ethernet phy driver

David Lechner dlechner at baylibre.com
Tue Apr 28 21:30:19 CEST 2026


On 4/28/26 8:17 AM, Julien Stephan wrote:
> Add Airoha AN8801 Ethernet PHY driver (air_an8801.c).
> Implement CL22/CL45 MDIO access, LED control, and RGMII delay
> configuration. Provide probe, initialization, LED setup, and status
> handling. Expose DTS properties for clock delays. Register driver with
> PHY framework and trigger on startup.
> 

...

> +struct air_led_cfg {
> +	u16 en;		/* LED Enable */
> +	u16 gpio;	/* GPIO */
> +	u16 pol;	/* LED Polarity */
> +	u16 on_cfg;	/* LED On */
> +	u16 blk_cfg;	/* LED Blink */
> +};
> +

nit: make the variable names longer so that we don't need
comments to explain them

> +static int an8801r_rgmii_delay_config(struct phy_device *phydev)
> +{
> +	struct an8801r_priv *priv = phydev_cfg(phydev);
> +	int ret;
> +
> +	switch (phydev->interface) {
> +	case PHY_INTERFACE_MODE_RGMII_TXID:
> +		return an8801r_rgmii_txdelay(phydev, AIR_RGMII_DELAY_STEP_4);
> +	case PHY_INTERFACE_MODE_RGMII_RXID:
> +		return an8801r_rgmii_rxdelay(phydev, AIR_RGMII_DELAY_NOSTEP, true);
> +	case PHY_INTERFACE_MODE_RGMII_ID:
> +		ret = an8801r_rgmii_txdelay(phydev, AIR_RGMII_DELAY_STEP_4);
> +		if (ret)
> +			return ret;
> +		return an8801r_rgmii_rxdelay(phydev, AIR_RGMII_DELAY_NOSTEP, true);
> +	case PHY_INTERFACE_MODE_RGMII:
> +	default:
> +		if (priv->rxdelay_force) {
> +			ret = an8801r_rgmii_rxdelay(phydev, priv->rxdelay_step,
> +						    priv->rxdelay_align);
> +			if (ret)
> +				return ret;
> +		}
> +		if (priv->txdelay_force)
> +			return an8801r_rgmii_txdelay(phydev, priv->txdelay_step);
> +		break;

nit: Could just return 0; here.

> +	}
> +	return 0;
> +}
> +

...

> +static int an8801r_phy_probe(struct phy_device *phydev)
> +{
> +	struct an8801r_priv *priv;
> +	u32 phy_id;
> +	int ret;
> +
> +	ret = get_phy_id(phydev->bus, phydev->addr, MDIO_DEVAD_NONE, &phy_id);
> +	if (ret)
> +		return ret;
> +
> +	if (phy_id != AN8801R_PHY_ID) {
> +		dev_err(phydev->dev,
> +			"AN8801R can't be detected (id=0x%08x).\n", phy_id);
> +		return -ENODEV;
> +	}
> +
> +	priv = calloc(1, sizeof(struct an8801r_priv));

Why calloc() for 1 item?

I think usual would be:

	priv = malloc(sizeof(*priv));

> +	if (!priv)
> +		return -ENOMEM;
> +
> +	*priv = an8801r_priv_defaults;
> +
> +	phydev->priv = priv;
> +
> +	return 0;
> +}
> +



More information about the U-Boot mailing list