Skip to content

Commit

Permalink
net: pcs: rzn1-miic: Init RX clock early if MAC requires it
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Romain Gantois authored and Jakub Kicinski committed Mar 29, 2024
1 parent 30dc587 commit 0f671b3
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions drivers/net/pcs/pcs-rzn1-miic.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 0f671b3

Please sign in to comment.