[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