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

net: phy: mediatek: Add token ring clear bit operation support

Similar to __mtk_tr_set_bits() support. Previously in mtk-ge-soc.c,
we clear some register bits via token ring, which were also implemented
in three __phy_write(). Now we can do the same thing via
__mtk_tr_clr_bits() helper.

Signed-off-by: Sky Huang <skylake.huang@mediatek.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20250213080553.921434-5-SkyLake.Huang@mediatek.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Sky Huang and committed by
Jakub Kicinski
4786eff2 40d33d6d

+27 -12
+18 -12
drivers/net/phy/mediatek/mtk-ge-soc.c
··· 76 76 /* FfeUpdGainForce */ 77 77 #define FFE_UPDATE_GAIN_FORCE BIT(6) 78 78 79 + /* ch_addr = 0x2, node_addr = 0xd, data_addr = 0x3 */ 80 + /* TrFreeze */ 81 + #define TR_FREEZE_MASK GENMASK(11, 0) 82 + 79 83 /* ch_addr = 0x2, node_addr = 0xd, data_addr = 0x6 */ 80 84 /* SS: Steady-state, KP: Proportional Gain */ 81 85 /* SSTrKp100 */ ··· 94 90 #define SS_TR_KP1000_SLAVE_MASK GENMASK(9, 7) 95 91 /* SSTrKf1000Slv */ 96 92 #define SS_TR_KF1000_SLAVE_MASK GENMASK(6, 4) 93 + 94 + /* ch_addr = 0x2, node_addr = 0xd, data_addr = 0x8 */ 95 + /* clear this bit if wanna select from AFE */ 96 + /* Regsigdet_sel_1000 */ 97 + #define EEE1000_SELECT_SIGNAL_DETECTION_FROM_DFE BIT(4) 97 98 98 99 /* ch_addr = 0x2, node_addr = 0xd, data_addr = 0xd */ 99 100 /* RegEEE_st2TrKf1000 */ ··· 121 112 /* ch_addr = 0x2, node_addr = 0xd, data_addr = 0x1c */ 122 113 /* RegEEE100Stg1_tar */ 123 114 #define EEE100_LPSYNC_STAGE1_UPDATE_TIMER_MASK GENMASK(8, 0) 115 + 116 + /* ch_addr = 0x2, node_addr = 0xd, data_addr = 0x25 */ 117 + /* REGEEE_wake_slv_tr_wait_dfesigdet_en */ 118 + #define WAKE_SLAVE_TR_WAIT_DFE_DETECTION_EN BIT(11) 124 119 125 120 #define ANALOG_INTERNAL_OPERATION_MAX_US 20 126 121 #define TXRESERVE_MIN 0 ··· 818 805 FIELD_PREP(FFE_UPDATE_GAIN_FORCE_VAL_MASK, 0x4) | 819 806 FFE_UPDATE_GAIN_FORCE); 820 807 821 - /* TrFreeze = 0 (mt7988 default) */ 822 - __phy_write(phydev, 0x11, 0x0); 823 - __phy_write(phydev, 0x12, 0x0); 824 - __phy_write(phydev, 0x10, 0x9686); 808 + __mtk_tr_clr_bits(phydev, 0x2, 0xd, 0x3, TR_FREEZE_MASK); 825 809 826 810 __mtk_tr_modify(phydev, 0x2, 0xd, 0x6, 827 811 SS_TR_KP100_MASK | SS_TR_KF100_MASK | ··· 1019 1009 MTK_PHY_TR_READY_SKIP_AFE_WAKEUP); 1020 1010 1021 1011 phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5); 1022 - /* Regsigdet_sel_1000 = 0 */ 1023 - __phy_write(phydev, 0x11, 0xb); 1024 - __phy_write(phydev, 0x12, 0x0); 1025 - __phy_write(phydev, 0x10, 0x9690); 1012 + __mtk_tr_clr_bits(phydev, 0x2, 0xd, 0x8, 1013 + EEE1000_SELECT_SIGNAL_DETECTION_FROM_DFE); 1026 1014 1027 1015 __mtk_tr_modify(phydev, 0x2, 0xd, 0xd, 1028 1016 EEE1000_STAGE2_TR_KF_MASK, ··· 1044 1036 FIELD_PREP(EEE100_LPSYNC_STAGE1_UPDATE_TIMER_MASK, 1045 1037 0x10)); 1046 1038 1047 - /* REGEEE_wake_slv_tr_wait_dfesigdet_en = 0 */ 1048 - __phy_write(phydev, 0x11, 0x1463); 1049 - __phy_write(phydev, 0x12, 0x0); 1050 - __phy_write(phydev, 0x10, 0x96ca); 1039 + __mtk_tr_clr_bits(phydev, 0x2, 0xd, 0x25, 1040 + WAKE_SLAVE_TR_WAIT_DFE_DETECTION_EN); 1051 1041 1052 1042 __mtk_tr_modify(phydev, 0x1, 0xf, 0x0, 1053 1043 DFE_TAIL_EANBLE_VGA_TRHESH_1000,
+7
drivers/net/phy/mediatek/mtk-phy-lib.c
··· 76 76 } 77 77 EXPORT_SYMBOL_GPL(__mtk_tr_set_bits); 78 78 79 + void __mtk_tr_clr_bits(struct phy_device *phydev, u8 ch_addr, u8 node_addr, 80 + u8 data_addr, u32 clr) 81 + { 82 + __mtk_tr_modify(phydev, ch_addr, node_addr, data_addr, clr, 0); 83 + } 84 + EXPORT_SYMBOL_GPL(__mtk_tr_clr_bits); 85 + 79 86 int mtk_phy_read_page(struct phy_device *phydev) 80 87 { 81 88 return __phy_read(phydev, MTK_EXT_PAGE_ACCESS);
+2
drivers/net/phy/mediatek/mtk.h
··· 74 74 u8 data_addr, u32 mask, u32 set); 75 75 void __mtk_tr_set_bits(struct phy_device *phydev, u8 ch_addr, u8 node_addr, 76 76 u8 data_addr, u32 set); 77 + void __mtk_tr_clr_bits(struct phy_device *phydev, u8 ch_addr, u8 node_addr, 78 + u8 data_addr, u32 clr); 77 79 78 80 int mtk_phy_read_page(struct phy_device *phydev); 79 81 int mtk_phy_write_page(struct phy_device *phydev, int page);