@@ -2305,26 +2305,33 @@ static int rtpcs_930x_setup_serdes(struct rtpcs_serdes *sds,
23052305
23062306/* RTL931X */
23072307
2308+ static int rtpcs_931x_sds_power (struct rtpcs_serdes * sds , bool power_on )
2309+ {
2310+ u32 en_val = power_on ? 0 : BIT (sds -> id );
2311+
2312+ return regmap_write_bits (sds -> ctrl -> map ,
2313+ RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR ,
2314+ BIT (sds -> id ), en_val );
2315+ }
2316+
23082317static void rtpcs_931x_sds_reset (struct rtpcs_serdes * sds )
23092318{
23102319 struct rtpcs_ctrl * ctrl = sds -> ctrl ;
23112320 u32 sds_id = sds -> id ;
2312- u32 o , v , o_mode ;
2321+ u32 v , o_mode ;
23132322 int shift = ((sds_id & 0x3 ) << 3 );
23142323
23152324 /* TODO: We need to lock this! */
23162325
2317- regmap_read (ctrl -> map , RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR , & o );
2318- v = o | BIT (sds_id );
2319- regmap_write (ctrl -> map , RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR , v );
2326+ rtpcs_931x_sds_power (sds , false);
23202327
23212328 regmap_read (ctrl -> map , RTL931X_SERDES_MODE_CTRL + 4 * (sds_id >> 2 ), & o_mode );
23222329 v = BIT (7 ) | 0x1F ;
23232330 regmap_write_bits (ctrl -> map , RTL931X_SERDES_MODE_CTRL + 4 * (sds_id >> 2 ),
23242331 0xff << shift , v << shift );
23252332 regmap_write (ctrl -> map , RTL931X_SERDES_MODE_CTRL + 4 * (sds_id >> 2 ), o_mode );
23262333
2327- regmap_write ( ctrl -> map , RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR , o );
2334+ rtpcs_931x_sds_power ( sds , true );
23282335}
23292336
23302337static void rtpcs_931x_sds_disable (struct rtpcs_serdes * sds )
@@ -2809,8 +2816,8 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds,
28092816 };
28102817 struct rtpcs_serdes * even_sds = rtpcs_sds_get_even (sds );
28112818 struct rtpcs_ctrl * ctrl = sds -> ctrl ;
2812- u32 band , ori , model_info , val ;
28132819 enum rtpcs_sds_mode hw_mode ;
2820+ u32 band , model_info , val ;
28142821 u32 sds_id = sds -> id ;
28152822 int ret , chiptype = 0 ;
28162823
@@ -2852,10 +2859,7 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds,
28522859
28532860 pr_info ("%s: 2.5gbit %08X" , __func__ , rtpcs_sds_read (sds , 0x41 , 0x14 ));
28542861
2855- regmap_read (ctrl -> map , RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR , & ori );
2856- pr_info ("%s: RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR 0x%08X\n" , __func__ , ori );
2857- val = ori | (1 << sds_id );
2858- regmap_write (ctrl -> map , RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR , val );
2862+ rtpcs_931x_sds_power (sds , false);
28592863
28602864 /* this was in rtl931x_phylink_mac_config in dsa/rtl83xx/dsa.c before */
28612865 band = rtpcs_931x_sds_cmu_band_get (sds , mode );
@@ -2893,10 +2897,7 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds,
28932897
28942898 rtpcs_931x_sds_set_polarity (sds , sds -> tx_pol_inv , sds -> rx_pol_inv );
28952899
2896- val = ori & ~BIT (sds_id );
2897- regmap_write (ctrl -> map , RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR , val );
2898- regmap_read (ctrl -> map , RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR , & val );
2899- pr_debug ("%s: RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR 0x%08X\n" , __func__ , val );
2900+ rtpcs_931x_sds_power (sds , true);
29002901
29012902 if (mode == PHY_INTERFACE_MODE_XGMII ||
29022903 mode == PHY_INTERFACE_MODE_QSGMII ||
0 commit comments