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.

The driver first tries the standard properties; if absent it falls back
to the legacy ones for backward compatibility. The legacy properties are
marked deprecated in the bindings.

Link: https://git.kernel.org/linus/66d8a334b57e64e43810623b3d88f0ce9745270b
Signed-off-by: Lucien.Jheng <[email protected]>
---
 drivers/net/phy/airoha/Kconfig      |  1 +
 drivers/net/phy/airoha/air_en8811.c | 91 ++++++++++++++++++++++++-----
 2 files changed, 77 insertions(+), 15 deletions(-)

diff --git a/drivers/net/phy/airoha/Kconfig b/drivers/net/phy/airoha/Kconfig
index 999564e4848..efe3c0f485b 100644
--- a/drivers/net/phy/airoha/Kconfig
+++ b/drivers/net/phy/airoha/Kconfig
@@ -6,6 +6,7 @@ config PHY_AIROHA_EN8811
        bool "Airoha Ethernet EN8811H support"
        depends on PHY_AIROHA
        select FW_LOADER
+       select PHY_COMMON_PROPS
        help
          AIROHA EN8811H supported.
 
diff --git a/drivers/net/phy/airoha/air_en8811.c 
b/drivers/net/phy/airoha/air_en8811.c
index 1a628ede82b..0ec11ba5231 100644
--- a/drivers/net/phy/airoha/air_en8811.c
+++ b/drivers/net/phy/airoha/air_en8811.c
@@ -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>
 
 #define EN8811H_PHY_ID         0x03a2a411
 
@@ -660,11 +661,82 @@ 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_polarity(struct phy_device *phydev)
 {
-       struct en8811h_priv *priv = phydev->priv;
        ofnode node = phy_get_ofnode(phydev);
+       unsigned int rx_pol, tx_pol;
        u32 pbus_value = 0;
+       int ret;
+       bool use_legacy = false;
+
+       if (!ofnode_valid(node))
+               return 0;
+
+       /* Try standard rx-polarity property first */
+       ret = phy_get_manual_rx_polarity(node,
+                                        
phy_interface_strings[phydev->interface],
+                                        &rx_pol);
+       if (ret == 0) {
+               dev_info(phydev->dev, "EN8811H: RX polarity = %s\n",
+                        rx_pol == PHY_POL_INVERT ? "inverted" : "normal");
+               if (rx_pol == PHY_POL_INVERT)
+                       pbus_value |= EN8811H_POLARITY_RX_REVERSE;
+               else
+                       pbus_value &= ~EN8811H_POLARITY_RX_REVERSE;
+       } else if (ret == -ENOENT) {
+               /* Fall back to legacy airoha,pnswap-rx property */
+               use_legacy = true;
+               dev_info(phydev->dev, "EN8811H: Legacy RX polarity\n");
+
+               if (ofnode_read_bool(node, "airoha,pnswap-rx"))
+                       pbus_value |= EN8811H_POLARITY_RX_REVERSE;
+               else
+                       pbus_value &= ~EN8811H_POLARITY_RX_REVERSE;
+       } else {
+               dev_err(phydev->dev, "EN8811H: Error reading rx-polarity: 
%d\n", ret);
+               return ret;
+       }
+
+       /* Try standard tx-polarity property first */
+       ret = phy_get_manual_tx_polarity(node,
+                                        
phy_interface_strings[phydev->interface],
+                                        &tx_pol);
+       if (ret == 0) {
+               dev_info(phydev->dev, "EN8811H: TX polarity = %s\n",
+                        tx_pol == PHY_POL_INVERT ? "inverted" : "normal");
+               if (tx_pol == PHY_POL_INVERT)
+                       pbus_value &= ~EN8811H_POLARITY_TX_NORMAL;
+               else
+                       pbus_value |= EN8811H_POLARITY_TX_NORMAL;
+       } else if (ret == -ENOENT) {
+               /* Fall back to legacy airoha,pnswap-tx property */
+               if (!use_legacy)
+                       dev_err(phydev->dev, "EN8811H: Mixing standard and 
legacy polarity properties\n");
+
+               dev_info(phydev->dev, "EN8811H: Legacy TX polarity\n");
+
+               if (ofnode_read_bool(node, "airoha,pnswap-tx"))
+                       pbus_value &= ~EN8811H_POLARITY_TX_NORMAL;
+               else
+                       pbus_value |= EN8811H_POLARITY_TX_NORMAL;
+       } else {
+               dev_err(phydev->dev, "EN8811H: Error reading tx-polarity: 
%d\n", ret);
+               return ret;
+       }
+
+       /* Apply polarity configuration to hardware */
+       ret = air_buckpbus_reg_modify(phydev, EN8811H_POLARITY,
+                                     EN8811H_POLARITY_RX_REVERSE |
+                                     EN8811H_POLARITY_TX_NORMAL, pbus_value);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
+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 */
@@ -695,19 +767,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_polarity(phydev);
        if (ret < 0)
                return ret;
 
-- 
2.34.1

Reply via email to