net: pcs: rzn1-miic: Init RX clock early if MAC requires it
The GMAC1 controller in the RZN1 IP requires the RX MII clock signal to be started before it initializes its own hardware, thus before it calls phylink_start. Implement the pcs_pre_init() callback so that the RX clock signal can be enabled early if necessary. Reported-by: Clément Léger <clement.leger@bootlin.com> Link: https://lore.kernel.org/linux-arm-kernel/20230116103926.276869-4-clement.leger@bootlin.com/ Signed-off-by: Romain Gantois <romain.gantois@bootlin.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Link: https://lore.kernel.org/r/20240326-rxc_bugfix-v6-7-24a74e5c761f@bootlin.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
30dc587396
commit
0f671b3b6e
@ -279,10 +279,38 @@ static int miic_validate(struct phylink_pcs *pcs, unsigned long *supported,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int miic_pre_init(struct phylink_pcs *pcs)
|
||||
{
|
||||
struct miic_port *miic_port = phylink_pcs_to_miic_port(pcs);
|
||||
struct miic *miic = miic_port->miic;
|
||||
u32 val, mask;
|
||||
|
||||
/* Start RX clock if required */
|
||||
if (pcs->rxc_always_on) {
|
||||
/* In MII through mode, the clock signals will be driven by the
|
||||
* external PHY, which might not be initialized yet. Set RMII
|
||||
* as default mode to ensure that a reference clock signal is
|
||||
* generated.
|
||||
*/
|
||||
miic_port->interface = PHY_INTERFACE_MODE_RMII;
|
||||
|
||||
val = FIELD_PREP(MIIC_CONVCTRL_CONV_MODE, CONV_MODE_RMII) |
|
||||
FIELD_PREP(MIIC_CONVCTRL_CONV_SPEED, CONV_MODE_100MBPS);
|
||||
mask = MIIC_CONVCTRL_CONV_MODE | MIIC_CONVCTRL_CONV_SPEED;
|
||||
|
||||
miic_reg_rmw(miic, MIIC_CONVCTRL(miic_port->port), mask, val);
|
||||
|
||||
miic_converter_enable(miic, miic_port->port, 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct phylink_pcs_ops miic_phylink_ops = {
|
||||
.pcs_validate = miic_validate,
|
||||
.pcs_config = miic_config,
|
||||
.pcs_link_up = miic_link_up,
|
||||
.pcs_pre_init = miic_pre_init,
|
||||
};
|
||||
|
||||
struct phylink_pcs *miic_create(struct device *dev, struct device_node *np)
|
||||
|
Loading…
Reference in New Issue
Block a user