[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