]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: phy: air_phy_lib: Factorize BuckPBus register accessors
authorLouis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
Tue, 26 May 2026 14:58:08 +0000 (16:58 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 28 May 2026 01:39:24 +0000 (18:39 -0700)
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.

Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
Link: https://patch.msgid.link/20260526-add-airoha-an8801-support-v5-3-01aea8dee69b@collabora.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/air_en8811h.c
drivers/net/phy/air_phy_lib.c
drivers/net/phy/air_phy_lib.h

index be7c3426182a26fe3799b875827750e7772caadd..2498bd3f799346e4325b6124bf8cfe059726b9c4 100644 (file)
 #define   AIR_AUX_CTRL_STATUS_SPEED_1000       0x8
 #define   AIR_AUX_CTRL_STATUS_SPEED_2500       0xc
 
-#define   AIR_PHY_PAGE_STANDARD                        0x0000
-#define   AIR_PHY_PAGE_EXTENDED_4              0x0004
-
-/* MII Registers Page 4*/
-#define AIR_BPBUS_MODE                 0x10
-#define   AIR_BPBUS_MODE_ADDR_FIXED            0x0000
-#define   AIR_BPBUS_MODE_ADDR_INCR             BIT(15)
-#define AIR_BPBUS_WR_ADDR_HIGH         0x11
-#define AIR_BPBUS_WR_ADDR_LOW          0x12
-#define AIR_BPBUS_WR_DATA_HIGH         0x13
-#define AIR_BPBUS_WR_DATA_LOW          0x14
-#define AIR_BPBUS_RD_ADDR_HIGH         0x15
-#define AIR_BPBUS_RD_ADDR_LOW          0x16
-#define AIR_BPBUS_RD_DATA_HIGH         0x17
-#define AIR_BPBUS_RD_DATA_LOW          0x18
-
 /* Registers on MDIO_MMD_VEND1 */
 #define EN8811H_PHY_FW_STATUS          0x8009
 #define   EN8811H_PHY_READY                    0x02
@@ -245,183 +229,6 @@ static const unsigned long en8811h_led_trig = BIT(TRIGGER_NETDEV_FULL_DUPLEX) |
                                              BIT(TRIGGER_NETDEV_RX)          |
                                              BIT(TRIGGER_NETDEV_TX);
 
-static int __air_buckpbus_reg_write(struct phy_device *phydev,
-                                   u32 pbus_address, u32 pbus_data)
-{
-       int ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
-       if (ret < 0)
-               return ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
-                         upper_16_bits(pbus_address));
-       if (ret < 0)
-               return ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
-                         lower_16_bits(pbus_address));
-       if (ret < 0)
-               return ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
-                         upper_16_bits(pbus_data));
-       if (ret < 0)
-               return ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
-                         lower_16_bits(pbus_data));
-       if (ret < 0)
-               return ret;
-
-       return 0;
-}
-
-static int air_buckpbus_reg_write(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_write(phydev, pbus_address,
-                                              pbus_data);
-               if (ret < 0)
-                       phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
-                                  pbus_address, ret);
-       }
-
-       return phy_restore_page(phydev, saved_page, ret);
-}
-
-static int __air_buckpbus_reg_read(struct phy_device *phydev,
-                                  u32 pbus_address, u32 *pbus_data)
-{
-       int pbus_data_low, pbus_data_high;
-       int ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
-       if (ret < 0)
-               return ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
-                         upper_16_bits(pbus_address));
-       if (ret < 0)
-               return ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
-                         lower_16_bits(pbus_address));
-       if (ret < 0)
-               return ret;
-
-       pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
-       if (pbus_data_high < 0)
-               return pbus_data_high;
-
-       pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
-       if (pbus_data_low < 0)
-               return pbus_data_low;
-
-       *pbus_data = pbus_data_low | (pbus_data_high << 16);
-       return 0;
-}
-
-static int air_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)
-                       phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
-                                  pbus_address, ret);
-       }
-
-       return phy_restore_page(phydev, saved_page, ret);
-}
-
-static int __air_buckpbus_reg_modify(struct phy_device *phydev,
-                                    u32 pbus_address, u32 mask, u32 set)
-{
-       int pbus_data_low, pbus_data_high;
-       u32 pbus_data_old, pbus_data_new;
-       int ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
-       if (ret < 0)
-               return ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
-                         upper_16_bits(pbus_address));
-       if (ret < 0)
-               return ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
-                         lower_16_bits(pbus_address));
-       if (ret < 0)
-               return ret;
-
-       pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
-       if (pbus_data_high < 0)
-               return pbus_data_high;
-
-       pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
-       if (pbus_data_low < 0)
-               return pbus_data_low;
-
-       pbus_data_old = pbus_data_low | (pbus_data_high << 16);
-       pbus_data_new = (pbus_data_old & ~mask) | set;
-       if (pbus_data_new == pbus_data_old)
-               return 0;
-
-       ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
-                         upper_16_bits(pbus_address));
-       if (ret < 0)
-               return ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
-                         lower_16_bits(pbus_address));
-       if (ret < 0)
-               return ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
-                         upper_16_bits(pbus_data_new));
-       if (ret < 0)
-               return ret;
-
-       ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
-                         lower_16_bits(pbus_data_new));
-       if (ret < 0)
-               return ret;
-
-       return 0;
-}
-
-static int air_buckpbus_reg_modify(struct phy_device *phydev,
-                                  u32 pbus_address, u32 mask, u32 set)
-{
-       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_modify(phydev, pbus_address, mask,
-                                               set);
-               if (ret < 0)
-                       phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
-                                  pbus_address, ret);
-       }
-
-       return phy_restore_page(phydev, saved_page, ret);
-}
-
 static int __air_write_buf(struct phy_device *phydev, u32 address,
                           const struct firmware *fw)
 {
index 8ef5af4becf03166c80db04922a7f9516e85179c..aba4f95fe9e66ec82db025617e7ab741fdaa5e9a 100644 (file)
 #include <linux/export.h>
 #include <linux/module.h>
 #include <linux/phy.h>
+#include <linux/wordpart.h>
 
 #include "air_phy_lib.h"
 
 #define AIR_EXT_PAGE_ACCESS            0x1f
 
+static int __air_buckpbus_reg_read(struct phy_device *phydev,
+                                  u32 pbus_address, u32 *pbus_data)
+{
+       int pbus_data_low, pbus_data_high;
+       int ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
+       if (ret < 0)
+               return ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
+                         upper_16_bits(pbus_address));
+       if (ret < 0)
+               return ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
+                         lower_16_bits(pbus_address));
+       if (ret < 0)
+               return ret;
+
+       pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
+       if (pbus_data_high < 0)
+               return pbus_data_high;
+
+       pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
+       if (pbus_data_low < 0)
+               return pbus_data_low;
+
+       *pbus_data = pbus_data_low | (pbus_data_high << 16);
+       return 0;
+}
+
+static int __air_buckpbus_reg_write(struct phy_device *phydev,
+                                   u32 pbus_address, u32 pbus_data)
+{
+       int ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
+       if (ret < 0)
+               return ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
+                         upper_16_bits(pbus_address));
+       if (ret < 0)
+               return ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
+                         lower_16_bits(pbus_address));
+       if (ret < 0)
+               return ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
+                         upper_16_bits(pbus_data));
+       if (ret < 0)
+               return ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
+                         lower_16_bits(pbus_data));
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
+static int __air_buckpbus_reg_modify(struct phy_device *phydev,
+                                    u32 pbus_address, u32 mask, u32 set)
+{
+       int pbus_data_low, pbus_data_high;
+       u32 pbus_data_old, pbus_data_new;
+       int ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
+       if (ret < 0)
+               return ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
+                         upper_16_bits(pbus_address));
+       if (ret < 0)
+               return ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
+                         lower_16_bits(pbus_address));
+       if (ret < 0)
+               return ret;
+
+       pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
+       if (pbus_data_high < 0)
+               return pbus_data_high;
+
+       pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
+       if (pbus_data_low < 0)
+               return pbus_data_low;
+
+       pbus_data_old = pbus_data_low | (pbus_data_high << 16);
+       pbus_data_new = (pbus_data_old & ~mask) | set;
+       if (pbus_data_new == pbus_data_old)
+               return 0;
+
+       ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
+                         upper_16_bits(pbus_address));
+       if (ret < 0)
+               return ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
+                         lower_16_bits(pbus_address));
+       if (ret < 0)
+               return ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
+                         upper_16_bits(pbus_data_new));
+       if (ret < 0)
+               return ret;
+
+       ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
+                         lower_16_bits(pbus_data_new));
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
+int air_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)
+                       phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
+                                  pbus_address, ret);
+       }
+
+       return phy_restore_page(phydev, saved_page, ret);
+}
+EXPORT_SYMBOL_GPL(air_buckpbus_reg_read);
+
+int air_buckpbus_reg_write(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_write(phydev, pbus_address,
+                                              pbus_data);
+               if (ret < 0)
+                       phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
+                                  pbus_address, ret);
+       }
+
+       return phy_restore_page(phydev, saved_page, ret);
+}
+EXPORT_SYMBOL_GPL(air_buckpbus_reg_write);
+
+int air_buckpbus_reg_modify(struct phy_device *phydev, u32 pbus_address,
+                           u32 mask, u32 set)
+{
+       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_modify(phydev, pbus_address, mask,
+                                               set);
+               if (ret < 0)
+                       phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
+                                  pbus_address, ret);
+       }
+
+       return phy_restore_page(phydev, saved_page, ret);
+}
+EXPORT_SYMBOL_GPL(air_buckpbus_reg_modify);
+
 int air_phy_read_page(struct phy_device *phydev)
 {
        return __phy_read(phydev, AIR_EXT_PAGE_ACCESS);
index 79367e8e59077fd52853868724e0363939a922ce..b637f3e0f2d55c26447f217da30102ff55881543 100644 (file)
 
 #include <linux/phy.h>
 
+#define AIR_PHY_PAGE_STANDARD          0x0000
+#define AIR_PHY_PAGE_EXTENDED_1                0x0001
+#define AIR_PHY_PAGE_EXTENDED_4                0x0004
+
+/* MII Registers Page 4*/
+#define AIR_BPBUS_MODE                 0x10
+#define   AIR_BPBUS_MODE_ADDR_FIXED            0x0000
+#define   AIR_BPBUS_MODE_ADDR_INCR             BIT(15)
+#define AIR_BPBUS_WR_ADDR_HIGH         0x11
+#define AIR_BPBUS_WR_ADDR_LOW          0x12
+#define AIR_BPBUS_WR_DATA_HIGH         0x13
+#define AIR_BPBUS_WR_DATA_LOW          0x14
+#define AIR_BPBUS_RD_ADDR_HIGH         0x15
+#define AIR_BPBUS_RD_ADDR_LOW          0x16
+#define AIR_BPBUS_RD_DATA_HIGH         0x17
+#define AIR_BPBUS_RD_DATA_LOW          0x18
+
+int air_buckpbus_reg_modify(struct phy_device *phydev, u32 pbus_address,
+                           u32 mask, u32 set);
+int air_buckpbus_reg_read(struct phy_device *phydev, u32 pbus_address,
+                         u32 *pbus_data);
+int air_buckpbus_reg_write(struct phy_device *phydev, u32 pbus_address,
+                          u32 pbus_data);
 int air_phy_read_page(struct phy_device *phydev);
 int air_phy_write_page(struct phy_device *phydev, int page);