Skip to content

Commit b43f7bc

Browse files
jonasjelonekhauke
authored andcommitted
realtek: pcs: rtl931x: add helper for SerDes power up/down
Add a dedicated helper 'rtpcs_931x_sds_power' to power down/up a SerDes. Up to now, plain register writes to the corresponding register were used in several places and with slightly different syntax. Use the helper to replace the existing boilerplate code for powering on/off SerDes. Signed-off-by: Jonas Jelonek <[email protected]> Link: openwrt/openwrt#21184 Signed-off-by: Hauke Mehrtens <[email protected]>
1 parent 7899dfa commit b43f7bc

File tree

1 file changed

+15
-14
lines changed

1 file changed

+15
-14
lines changed

target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
23082317
static 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

23302337
static 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

Comments
 (0)