]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
net: phy: airoha: air_en8811: use standard rx-polarity/tx-polarity properties
authorLucien.Jheng <lucienzx159@gmail.com>
Sat, 25 Apr 2026 08:06:48 +0000 (16:06 +0800)
committerJerome Forissier <jerome.forissier@arm.com>
Wed, 6 May 2026 09:07:22 +0000 (11:07 +0200)
Replace the proprietary airoha,pnswap-rx / airoha,pnswap-tx boolean
device tree properties with the standard rx-polarity and tx-polarity
properties defined in phy-common-props.yaml.

Backward compatibility is maintained by reading the legacy boolean
properties first and passing them as the default_pol argument to
phy_get_rx/tx_polarity(). If the standard properties are absent the
legacy values are used transparently, so existing device trees remain
functional without modification.

Link: https://git.kernel.org/linus/66d8a334b57e64e43810623b3d88f0ce9745270b
Signed-off-by: Lucien.Jheng <lucienzx159@gmail.com>
drivers/net/phy/airoha/Kconfig
drivers/net/phy/airoha/air_en8811.c

index da8747939e316564219672949fbc2ada67a72337..4139df343adbfb5a3fa9257f8be137fccf8221b5 100644 (file)
@@ -7,6 +7,7 @@ config PHY_AIROHA_EN8811
        depends on PHY_AIROHA
        depends on SUPPORTS_FW_LOADER
        select FW_LOADER
+       select PHY_COMMON_PROPS
        help
          AIROHA EN8811H supported.
          AIROHA AN8811HB supported.
index 0b974472732b953fa5ed008c0a2275a3c00bf539..32f06dd6dfa3cce1d1de36e27657d377dfd7bd76 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/compat.h>
 #include <dm/device_compat.h>
 #include <u-boot/crc.h>
+#include <linux/phy/phy-common-props.h>
 
 /* MII Registers */
 #define AIR_AUX_CTRL_STATUS            0x1d
@@ -1046,11 +1047,50 @@ static int air_leds_init(struct phy_device *phydev, int num, u16 dur, int mode)
        return 0;
 }
 
-static int en8811h_config(struct phy_device *phydev)
+static int en8811h_config_serdes_polarity(struct phy_device *phydev)
 {
-       struct en8811h_priv *priv = phydev->priv;
        ofnode node = phy_get_ofnode(phydev);
+       unsigned int pol, default_pol;
        u32 pbus_value = 0;
+       int ret;
+
+       if (!ofnode_valid(node))
+               return 0;
+
+       default_pol = PHY_POL_NORMAL;
+       if (ofnode_read_bool(node, "airoha,pnswap-rx"))
+               default_pol = PHY_POL_INVERT;
+
+       ret = phy_get_rx_polarity(node,
+                                 phy_string_for_interface(phydev->interface),
+                                 BIT(PHY_POL_NORMAL) | BIT(PHY_POL_INVERT),
+                                 default_pol, &pol);
+       if (ret)
+               return ret;
+       if (pol == PHY_POL_INVERT)
+               pbus_value |= EN8811H_POLARITY_RX_REVERSE;
+
+       default_pol = PHY_POL_NORMAL;
+       if (ofnode_read_bool(node, "airoha,pnswap-tx"))
+               default_pol = PHY_POL_INVERT;
+
+       ret = phy_get_tx_polarity(node,
+                                 phy_string_for_interface(phydev->interface),
+                                 BIT(PHY_POL_NORMAL) | BIT(PHY_POL_INVERT),
+                                 default_pol, &pol);
+       if (ret)
+               return ret;
+       if (pol == PHY_POL_NORMAL)
+               pbus_value |= EN8811H_POLARITY_TX_NORMAL;
+
+       return air_buckpbus_reg_modify(phydev, EN8811H_POLARITY,
+                                      EN8811H_POLARITY_RX_REVERSE |
+                                      EN8811H_POLARITY_TX_NORMAL, pbus_value);
+}
+
+static int en8811h_config(struct phy_device *phydev)
+{
+       struct en8811h_priv *priv = phydev->priv;
        int ret = 0;
 
        /* If restart happened in .probe(), no need to restart now */
@@ -1081,20 +1121,8 @@ static int en8811h_config(struct phy_device *phydev)
        if (ret < 0)
                return ret;
 
-       /* Serdes polarity */
-       pbus_value = 0;
-       if (ofnode_read_bool(node, "airoha,pnswap-rx"))
-               pbus_value |=  EN8811H_POLARITY_RX_REVERSE;
-       else
-               pbus_value &= ~EN8811H_POLARITY_RX_REVERSE;
-       if (ofnode_read_bool(node, "airoha,pnswap-tx"))
-               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 |
-                                     EN8811H_POLARITY_TX_NORMAL,
-                                     pbus_value);
+       /* Configure Serdes polarity from device tree */
+       ret = en8811h_config_serdes_polarity(phydev);
        if (ret < 0)
                return ret;