The function 'rtpcs_931x_sds_mii_mode_set' does not correctly write the
register. It just write a plain value at the determined register
address. While this works for SerDes with (id mod 4 == 0), it doesn't
for the other SerDes.
Fix that by using a corresponding shift and writing only some bits
instead of the whole register.
While at it, drop an unneeded blank line, add comment to explain a bit
that is set and use the BIT(..) helper for that instead of manual shift.
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/20736
Signed-off-by: Robert Marko <robimarko@gmail.com>
phy_interface_t mode)
{
u32 val;
+ int shift = ((sds->id & 0x3) << 3);
switch (mode) {
case PHY_INTERFACE_MODE_QSGMII:
return;
}
- val |= (1 << 7);
-
- regmap_write(sds->ctrl->map,
- RTL931X_SERDES_MODE_CTRL + 4 * (sds->id >> 2), val);
+ val |= BIT(7); /* force mode bit */
+ regmap_write_bits(sds->ctrl->map,
+ RTL931X_SERDES_MODE_CTRL + 4 * (sds->id >> 2),
+ 0xff << shift, val << shift);
}
static void rtpcs_931x_sds_disable(struct rtpcs_serdes *sds)