[PATCH 5/9] net: phy: air_phy_lib: Factorize BuckPBus register

David Lechner dlechner at baylibre.com
Thu Apr 23 16:41:14 CEST 2026


On 4/23/26 8:25 AM, Julien Stephan wrote:
> In preparation of Airoha AN8801R PHY support, move the BuckPBus
> register accessors and definitions, present in air_en8811h driver,
> into the Airoha PHY shared code (air_phy_lib), so they will be usable
> by the new driver without duplicating them.
> Also, update air_en8811h driver to use the new function names.
> 
> Adapted from [1].
> 
> [1]: https://lore.kernel.org/all/20260326-add-airoha-an8801-support-v2-2-1a42d6b6050f@collabora.com/

This can be written as a tag:


Link: https://lore.kernel.org/all/20260326-add-airoha-an8801-support-v2-2-1a42d6b6050f@collabora.com/ [1]
> 
> Signed-off-by: Julien Stephan <jstephan at baylibre.com>
> ---
>  MAINTAINERS                          |   2 +-
>  drivers/net/phy/airoha/Kconfig       |   6 +
>  drivers/net/phy/airoha/Makefile      |   1 +
>  drivers/net/phy/airoha/air_en8811.c  | 276 +++++++----------------------------
>  drivers/net/phy/airoha/air_phy_lib.c | 221 ++++++++++++++++++++++++++++
>  drivers/net/phy/airoha/air_phy_lib.h |  39 +++++
>  6 files changed, 320 insertions(+), 225 deletions(-)
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 40ba3542ca3..4bda6b9e8c4 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -61,7 +61,7 @@ F:	lib/acpi/
>  AIROHA PHY
>  M:	Tommy Shih <tommy.shih at airoha.com>
>  S:	Maintained
> -F:	drivers/net/phy/airoha/air_en8811.c
> +F:	drivers/net/phy/airoha/
>  
>  ALIST
>  M:	Simon Glass <sjg at chromium.org>
> diff --git a/drivers/net/phy/airoha/Kconfig b/drivers/net/phy/airoha/Kconfig
> index da8747939e3..2a2f4f05bb2 100644
> --- a/drivers/net/phy/airoha/Kconfig
> +++ b/drivers/net/phy/airoha/Kconfig
> @@ -7,6 +7,12 @@ config PHY_AIROHA_EN8811
>  	depends on PHY_AIROHA
>  	depends on SUPPORTS_FW_LOADER
>  	select FW_LOADER
> +	select PHY_AIRONA_PHYLIB
>  	help
>  	  AIROHA EN8811H supported.
>  	  AIROHA AN8811HB supported.
> +
> +config PHY_AIRONA_PHYLIB
> +	tristate
> +	help
> +	  Airoha Ethernet PHY common library
> diff --git a/drivers/net/phy/airoha/Makefile b/drivers/net/phy/airoha/Makefile
> index 84d23b19ab0..cbf123986f2 100644
> --- a/drivers/net/phy/airoha/Makefile
> +++ b/drivers/net/phy/airoha/Makefile
> @@ -1,3 +1,4 @@
>  # SPDX-License-Identifier: GPL-2.0
>  
>  obj-$(CONFIG_PHY_AIROHA_EN8811) += air_en8811.o
> +obj-$(CONFIG_PHY_AIRONA_PHYLIB) += air_phy_lib.o
> diff --git a/drivers/net/phy/airoha/air_en8811.c b/drivers/net/phy/airoha/air_en8811.c
> index 0b974472732..04b7282072d 100644
> --- a/drivers/net/phy/airoha/air_en8811.c
> +++ b/drivers/net/phy/airoha/air_en8811.c

...

> @@ -887,12 +725,12 @@ static int en8811h_restart_mcu(struct phy_device *phydev)
>  	if (ret < 0)
>  		return ret;
>  
> -	ret = air_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
> -				     EN8811H_FW_CTRL_1_START);
> +	ret = air_phy_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
> +					 EN8811H_FW_CTRL_1_START);
>  	if (ret < 0)
>  		return ret;
>  
> -	return air_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
> +	return air_phy_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
>  				      EN8811H_FW_CTRL_1_FINISH);

Need to fix alignment?

>  }
>  
> @@ -1091,8 +929,8 @@ static int en8811h_config(struct phy_device *phydev)
>  		pbus_value &= ~EN8811H_POLARITY_TX_NORMAL;
>  	else
>  		pbus_value |=  EN8811H_POLARITY_TX_NORMAL;
> -	ret = air_buckpbus_reg_modify(phydev, EN8811H_POLARITY,
> -				      EN8811H_POLARITY_RX_REVERSE |
> +	ret = air_phy_buckpbus_reg_modify(phydev, EN8811H_POLARITY,
> +					  EN8811H_POLARITY_RX_REVERSE |
>  				      EN8811H_POLARITY_TX_NORMAL,
>  				      pbus_value);

And here?

>  	if (ret < 0)
> @@ -1142,12 +980,12 @@ static int an8811hb_config(struct phy_device *phydev)
>  		priv->mcu_needs_restart = true;
>  	}
>  
> -	ret = air_buckpbus_reg_read(phydev, AN8811HB_PRO_ID, &pbus_value);
> +	ret = air_phy_buckpbus_reg_read(phydev, AN8811HB_PRO_ID, &pbus_value);
>  	if (ret < 0)
>  		return ret;
>  	priv->pro_id = (pbus_value & AN8811HB_PRO_ID_VERSION) + 1;
>  
> -	ret = air_buckpbus_reg_read(phydev, AN8811HB_HWTRAP2, &pbus_value);
> +	ret = air_phy_buckpbus_reg_read(phydev, AN8811HB_HWTRAP2, &pbus_value);
>  	if (ret < 0)
>  		return ret;
>  	priv->pkg_sel = (pbus_value & AN8811HB_HWTRAP2_PKG) >> 12;
> @@ -1163,8 +1001,8 @@ static int an8811hb_config(struct phy_device *phydev)
>  		pbus_value |= AN8811HB_RX_POLARITY_NORMAL;
>  
>  	debug("1 pbus_value 0x%x\n", pbus_value);
> -	ret = air_buckpbus_reg_modify(phydev, AN8811HB_RX_POLARITY,
> -				      AN8811HB_RX_POLARITY_NORMAL, pbus_value);
> +	ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_RX_POLARITY,
> +					  AN8811HB_RX_POLARITY_NORMAL, pbus_value);
>  	if (ret < 0)
>  		return ret;
>  
> @@ -1175,34 +1013,34 @@ static int an8811hb_config(struct phy_device *phydev)
>  		pbus_value |= AN8811HB_TX_POLARITY_NORMAL;
>  
>  	debug("2 pbus_value 0x%x\n", pbus_value);
> -	ret = air_buckpbus_reg_modify(phydev, AN8811HB_TX_POLARITY,
> -				      AN8811HB_TX_POLARITY_NORMAL, pbus_value);
> +	ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_TX_POLARITY,
> +					  AN8811HB_TX_POLARITY_NORMAL, pbus_value);
>  	if (ret < 0)
>  		return ret;
>  
>  	/* Configure led gpio pins as output */
>  	if (priv->pkg_sel) {
> -		ret = air_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,
> -					      AN8811HB_GPIO_OUTPUT_MASK,
> +		ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,
> +						  AN8811HB_GPIO_OUTPUT_MASK,
>  					      AN8811HB_GPIO_OUTPUT_0115);
>  		if (ret < 0)
>  			return ret;
> -		ret = air_buckpbus_reg_modify(phydev, AN8811HB_GPIO_SEL_1,
> -					      AN8811HB_GPIO_SEL_1_0_MASK |
> +		ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_SEL_1,
> +						  AN8811HB_GPIO_SEL_1_0_MASK |
>  					      AN8811HB_GPIO_SEL_1_1_MASK,
>  					      AN8811HB_GPIO_SEL_1_0 |
>  					      AN8811HB_GPIO_SEL_1_1);

and here, and below...

>  		if (ret < 0)
>  			return ret;
>  
> -		ret = air_buckpbus_reg_modify(phydev, AN8811HB_GPIO_SEL_2,
> -					      AN8811HB_GPIO_SEL_2_15_MASK,
> +		ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_SEL_2,
> +						  AN8811HB_GPIO_SEL_2_15_MASK,
>  					      AN8811HB_GPIO_SEL_2_15);
>  		if (ret < 0)
>  			return ret;
>  	} else {
> -		ret = air_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,
> -					      AN8811HB_GPIO_OUTPUT_345,
> +		ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,
> +						  AN8811HB_GPIO_OUTPUT_345,
>  					      AN8811HB_GPIO_OUTPUT_345);
>  		if (ret < 0)
>  			return ret;
> @@ -1373,16 +1211,6 @@ static int en8811h_probe(struct phy_device *phydev)
>  	return 0;
>  }
>  
> -static int air_phy_read_page(struct phy_device *phydev)
> -{
> -	return phy_read(phydev, MDIO_DEVAD_NONE, AIR_EXT_PAGE_ACCESS);
> -}
> -
> -static int air_phy_write_page(struct phy_device *phydev, int page)
> -{
> -	return phy_write(phydev, MDIO_DEVAD_NONE, AIR_EXT_PAGE_ACCESS, page);
> -}
> -
>  U_BOOT_PHY_DRIVER(en8811h) = {
>  	.name = "Airoha EN8811H",
>  	.uid = EN8811H_PHY_ID,
> diff --git a/drivers/net/phy/airoha/air_phy_lib.c b/drivers/net/phy/airoha/air_phy_lib.c
> new file mode 100644
> index 00000000000..133cba55bbf
> --- /dev/null
> +++ b/drivers/net/phy/airoha/air_phy_lib.c
> @@ -0,0 +1,221 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Airoha Ethernet PHY common library
> + *
> + * Copyright (C) 2026 Airoha Technology Corp.
> + * Copyright (C) 2026 Collabora Ltd.
> + *                    Louis-Alexis Eyraud <louisalexis.eyraud at collabora.com>
> + *
> + * Adapated from https://lore.kernel.org/all/20260326-add-airoha-an8801-support-v2-2-1a42d6b6050f@collabora.com/
> + */
> +

...

> +int air_phy_buckpbus_reg_read(struct phy_device *phydev, u32 pbus_address,
> +			      u32 *pbus_data)
> +{
> +	int saved_page;
> +	int ret = 0;
> +
> +	saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
> +
> +	if (saved_page >= 0) {
> +		ret = __air_buckpbus_reg_read(phydev, pbus_address, pbus_data);
> +		if (ret < 0)
> +			dev_err(phydev->dev, "%s 0x%08x failed: %d\n", __func__,
> +				pbus_address, ret);
> +	}
> +
> +	return phy_restore_page(phydev, saved_page, ret);
> +}
> +EXPORT_SYMBOL_GPL(air_phy_buckpbus_reg_read);

EXPORT_SYMBOL_GPL() is no-op in U-Boot. Should we just drop it?



More information about the U-Boot mailing list