Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'read-phy-address-of-switch-from-device-tree-on-mt7530-dsa-subdriver'

Arınç ÜNAL says:

====================
Read PHY address of switch from device tree on MT7530 DSA subdriver

This patch series makes the driver read the PHY address the switch listens
on from the device tree which, in result, brings support for MT7530
switches listening on a different PHY address than 31. And the patch series
simplifies the core operations.

Signed-off-by: Arınç ÜNAL <arinc.unal@arinc9.com>
====================

Link: https://lore.kernel.org/r/20240418-b4-for-netnext-mt7530-phy-addr-from-dt-and-simplify-core-ops-v3-0-3b5fb249b004@arinc9.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

+81 -90
+14 -14
drivers/net/dsa/mt7530-mdio.c
··· 18 18 static int 19 19 mt7530_regmap_write(void *context, unsigned int reg, unsigned int val) 20 20 { 21 - struct mii_bus *bus = context; 21 + struct mt7530_priv *priv = context; 22 + struct mii_bus *bus = priv->bus; 22 23 u16 page, r, lo, hi; 23 24 int ret; 24 25 ··· 28 27 lo = val & 0xffff; 29 28 hi = val >> 16; 30 29 31 - /* MT7530 uses 31 as the pseudo port */ 32 - ret = bus->write(bus, 0x1f, 0x1f, page); 30 + ret = bus->write(bus, priv->mdiodev->addr, 0x1f, page); 33 31 if (ret < 0) 34 32 return ret; 35 33 36 - ret = bus->write(bus, 0x1f, r, lo); 34 + ret = bus->write(bus, priv->mdiodev->addr, r, lo); 37 35 if (ret < 0) 38 36 return ret; 39 37 40 - ret = bus->write(bus, 0x1f, 0x10, hi); 38 + ret = bus->write(bus, priv->mdiodev->addr, 0x10, hi); 41 39 return ret; 42 40 } 43 41 44 42 static int 45 43 mt7530_regmap_read(void *context, unsigned int reg, unsigned int *val) 46 44 { 47 - struct mii_bus *bus = context; 45 + struct mt7530_priv *priv = context; 46 + struct mii_bus *bus = priv->bus; 48 47 u16 page, r, lo, hi; 49 48 int ret; 50 49 51 50 page = (reg >> 6) & 0x3ff; 52 51 r = (reg >> 2) & 0xf; 53 52 54 - /* MT7530 uses 31 as the pseudo port */ 55 - ret = bus->write(bus, 0x1f, 0x1f, page); 53 + ret = bus->write(bus, priv->mdiodev->addr, 0x1f, page); 56 54 if (ret < 0) 57 55 return ret; 58 56 59 - lo = bus->read(bus, 0x1f, r); 60 - hi = bus->read(bus, 0x1f, 0x10); 57 + lo = bus->read(bus, priv->mdiodev->addr, r); 58 + hi = bus->read(bus, priv->mdiodev->addr, 0x10); 61 59 62 60 *val = (hi << 16) | (lo & 0xffff); 63 61 ··· 107 107 mt7531_pcs_config[i]->unlock = mt7530_mdio_regmap_unlock; 108 108 mt7531_pcs_config[i]->lock_arg = &priv->bus->mdio_lock; 109 109 110 - regmap = devm_regmap_init(priv->dev, 111 - &mt7530_regmap_bus, priv->bus, 110 + regmap = devm_regmap_init(priv->dev, &mt7530_regmap_bus, priv, 112 111 mt7531_pcs_config[i]); 113 112 if (IS_ERR(regmap)) { 114 113 ret = PTR_ERR(regmap); ··· 152 153 153 154 priv->bus = mdiodev->bus; 154 155 priv->dev = &mdiodev->dev; 156 + priv->mdiodev = mdiodev; 155 157 156 158 ret = mt7530_probe_common(priv); 157 159 if (ret) ··· 203 203 regmap_config->reg_stride = 4; 204 204 regmap_config->max_register = MT7530_CREV; 205 205 regmap_config->disable_locking = true; 206 - priv->regmap = devm_regmap_init(priv->dev, &mt7530_regmap_bus, 207 - priv->bus, regmap_config); 206 + priv->regmap = devm_regmap_init(priv->dev, &mt7530_regmap_bus, priv, 207 + regmap_config); 208 208 if (IS_ERR(priv->regmap)) 209 209 return PTR_ERR(priv->regmap); 210 210
+64 -75
drivers/net/dsa/mt7530.c
··· 74 74 MIB_DESC(1, 0xb8, "RxArlDrop"), 75 75 }; 76 76 77 - /* Since phy_device has not yet been created and 78 - * phy_{read,write}_mmd_indirect is not available, we provide our own 79 - * core_{read,write}_mmd_indirect with core_{clear,write,set} wrappers 80 - * to complete this function. 81 - */ 82 - static int 83 - core_read_mmd_indirect(struct mt7530_priv *priv, int prtad, int devad) 84 - { 85 - struct mii_bus *bus = priv->bus; 86 - int value, ret; 87 - 88 - /* Write the desired MMD Devad */ 89 - ret = bus->write(bus, 0, MII_MMD_CTRL, devad); 90 - if (ret < 0) 91 - goto err; 92 - 93 - /* Write the desired MMD register address */ 94 - ret = bus->write(bus, 0, MII_MMD_DATA, prtad); 95 - if (ret < 0) 96 - goto err; 97 - 98 - /* Select the Function : DATA with no post increment */ 99 - ret = bus->write(bus, 0, MII_MMD_CTRL, (devad | MII_MMD_CTRL_NOINCR)); 100 - if (ret < 0) 101 - goto err; 102 - 103 - /* Read the content of the MMD's selected register */ 104 - value = bus->read(bus, 0, MII_MMD_DATA); 105 - 106 - return value; 107 - err: 108 - dev_err(&bus->dev, "failed to read mmd register\n"); 109 - 110 - return ret; 111 - } 112 - 113 - static int 114 - core_write_mmd_indirect(struct mt7530_priv *priv, int prtad, 115 - int devad, u32 data) 116 - { 117 - struct mii_bus *bus = priv->bus; 118 - int ret; 119 - 120 - /* Write the desired MMD Devad */ 121 - ret = bus->write(bus, 0, MII_MMD_CTRL, devad); 122 - if (ret < 0) 123 - goto err; 124 - 125 - /* Write the desired MMD register address */ 126 - ret = bus->write(bus, 0, MII_MMD_DATA, prtad); 127 - if (ret < 0) 128 - goto err; 129 - 130 - /* Select the Function : DATA with no post increment */ 131 - ret = bus->write(bus, 0, MII_MMD_CTRL, (devad | MII_MMD_CTRL_NOINCR)); 132 - if (ret < 0) 133 - goto err; 134 - 135 - /* Write the data into MMD's selected register */ 136 - ret = bus->write(bus, 0, MII_MMD_DATA, data); 137 - err: 138 - if (ret < 0) 139 - dev_err(&bus->dev, 140 - "failed to write mmd register\n"); 141 - return ret; 142 - } 143 - 144 77 static void 145 78 mt7530_mutex_lock(struct mt7530_priv *priv) 146 79 { ··· 91 158 static void 92 159 core_write(struct mt7530_priv *priv, u32 reg, u32 val) 93 160 { 161 + struct mii_bus *bus = priv->bus; 162 + int ret; 163 + 94 164 mt7530_mutex_lock(priv); 95 165 96 - core_write_mmd_indirect(priv, reg, MDIO_MMD_VEND2, val); 166 + /* Write the desired MMD Devad */ 167 + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr), 168 + MII_MMD_CTRL, MDIO_MMD_VEND2); 169 + if (ret < 0) 170 + goto err; 171 + 172 + /* Write the desired MMD register address */ 173 + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr), 174 + MII_MMD_DATA, reg); 175 + if (ret < 0) 176 + goto err; 177 + 178 + /* Select the Function : DATA with no post increment */ 179 + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr), 180 + MII_MMD_CTRL, MDIO_MMD_VEND2 | MII_MMD_CTRL_NOINCR); 181 + if (ret < 0) 182 + goto err; 183 + 184 + /* Write the data into MMD's selected register */ 185 + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr), 186 + MII_MMD_DATA, val); 187 + err: 188 + if (ret < 0) 189 + dev_err(&bus->dev, "failed to write mmd register\n"); 97 190 98 191 mt7530_mutex_unlock(priv); 99 192 } ··· 127 168 static void 128 169 core_rmw(struct mt7530_priv *priv, u32 reg, u32 mask, u32 set) 129 170 { 171 + struct mii_bus *bus = priv->bus; 130 172 u32 val; 173 + int ret; 131 174 132 175 mt7530_mutex_lock(priv); 133 176 134 - val = core_read_mmd_indirect(priv, reg, MDIO_MMD_VEND2); 177 + /* Write the desired MMD Devad */ 178 + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr), 179 + MII_MMD_CTRL, MDIO_MMD_VEND2); 180 + if (ret < 0) 181 + goto err; 182 + 183 + /* Write the desired MMD register address */ 184 + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr), 185 + MII_MMD_DATA, reg); 186 + if (ret < 0) 187 + goto err; 188 + 189 + /* Select the Function : DATA with no post increment */ 190 + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr), 191 + MII_MMD_CTRL, MDIO_MMD_VEND2 | MII_MMD_CTRL_NOINCR); 192 + if (ret < 0) 193 + goto err; 194 + 195 + /* Read the content of the MMD's selected register */ 196 + val = bus->read(bus, MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr), 197 + MII_MMD_DATA); 135 198 val &= ~mask; 136 199 val |= set; 137 - core_write_mmd_indirect(priv, reg, MDIO_MMD_VEND2, val); 200 + /* Write the data into MMD's selected register */ 201 + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr), 202 + MII_MMD_DATA, val); 203 + err: 204 + if (ret < 0) 205 + dev_err(&bus->dev, "failed to write mmd register\n"); 138 206 139 207 mt7530_mutex_unlock(priv); 140 208 } ··· 2665 2679 * phy_[read,write]_mmd_indirect is called, we provide our own 2666 2680 * mt7531_ind_mmd_phy_[read,write] to complete this function. 2667 2681 */ 2668 - val = mt7531_ind_c45_phy_read(priv, MT753X_CTRL_PHY_ADDR, 2682 + val = mt7531_ind_c45_phy_read(priv, 2683 + MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr), 2669 2684 MDIO_MMD_VEND2, CORE_PLL_GROUP4); 2670 2685 val |= MT7531_RG_SYSPLL_DMY2 | MT7531_PHY_PLL_BYPASS_MODE; 2671 2686 val &= ~MT7531_PHY_PLL_OFF; 2672 - mt7531_ind_c45_phy_write(priv, MT753X_CTRL_PHY_ADDR, MDIO_MMD_VEND2, 2673 - CORE_PLL_GROUP4, val); 2687 + mt7531_ind_c45_phy_write(priv, 2688 + MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr), 2689 + MDIO_MMD_VEND2, CORE_PLL_GROUP4, val); 2674 2690 2675 2691 /* Disable EEE advertisement on the switch PHYs. */ 2676 - for (i = MT753X_CTRL_PHY_ADDR; 2677 - i < MT753X_CTRL_PHY_ADDR + MT7530_NUM_PHYS; i++) { 2692 + for (i = MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr); 2693 + i < MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr) + MT7530_NUM_PHYS; 2694 + i++) { 2678 2695 mt7531_ind_c45_phy_write(priv, i, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 2679 2696 0); 2680 2697 }
+3 -1
drivers/net/dsa/mt7530.h
··· 629 629 #define MT7531_PHY_PLL_OFF BIT(5) 630 630 #define MT7531_PHY_PLL_BYPASS_MODE BIT(4) 631 631 632 - #define MT753X_CTRL_PHY_ADDR 0 632 + #define MT753X_CTRL_PHY_ADDR(addr) ((addr + 1) & 0x1f) 633 633 634 634 #define CORE_PLL_GROUP5 0x404 635 635 #define RG_LCDDS_PCW_NCPO1(x) ((x) & 0xffff) ··· 778 778 * @irq_enable: IRQ enable bits, synced to SYS_INT_EN 779 779 * @create_sgmii: Pointer to function creating SGMII PCS instance(s) 780 780 * @active_cpu_ports: Holding the active CPU ports 781 + * @mdiodev: The pointer to the MDIO device structure 781 782 */ 782 783 struct mt7530_priv { 783 784 struct device *dev; ··· 805 804 u32 irq_enable; 806 805 int (*create_sgmii)(struct mt7530_priv *priv); 807 806 u8 active_cpu_ports; 807 + struct mdio_device *mdiodev; 808 808 }; 809 809 810 810 struct mt7530_hw_vlan_entry {