Skip to content

Commit

Permalink
net: phy: c45-tja11xx: add support for outputting RMII reference clock
Browse files Browse the repository at this point in the history
For TJA11xx PHYs, they have the capability to output 50MHz reference
clock on REF_CLK pin in RMII mode, which is called "revRMII" mode in
the PHY data sheet.

Signed-off-by: Wei Fang <wei.fang@nxp.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
  • Loading branch information
Wei Fang authored and Paolo Abeni committed Oct 15, 2024
1 parent 09277e4 commit 6d8d898
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
30 changes: 29 additions & 1 deletion drivers/net/phy/nxp-c45-tja11xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <linux/kernel.h>
#include <linux/mii.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/phy.h>
#include <linux/processor.h>
#include <linux/property.h>
Expand Down Expand Up @@ -185,6 +186,8 @@

#define NXP_C45_SKB_CB(skb) ((struct nxp_c45_skb_cb *)(skb)->cb)

#define TJA11XX_REVERSE_MODE BIT(0)

struct nxp_c45_phy;

struct nxp_c45_skb_cb {
Expand Down Expand Up @@ -1510,6 +1513,8 @@ static int nxp_c45_get_delays(struct phy_device *phydev)

static int nxp_c45_set_phy_mode(struct phy_device *phydev)
{
struct nxp_c45_phy *priv = phydev->priv;
u16 basic_config;
int ret;

ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, VEND1_ABILITIES);
Expand Down Expand Up @@ -1561,8 +1566,15 @@ static int nxp_c45_set_phy_mode(struct phy_device *phydev)
phydev_err(phydev, "rmii mode not supported\n");
return -EINVAL;
}

basic_config = MII_BASIC_CONFIG_RMII;

/* This is not PHY_INTERFACE_MODE_REVRMII */
if (priv->flags & TJA11XX_REVERSE_MODE)
basic_config |= MII_BASIC_CONFIG_REV;

phy_write_mmd(phydev, MDIO_MMD_VEND1, VEND1_MII_BASIC_CONFIG,
MII_BASIC_CONFIG_RMII);
basic_config);
break;
case PHY_INTERFACE_MODE_SGMII:
if (!(ret & SGMII_ABILITY)) {
Expand Down Expand Up @@ -1623,6 +1635,20 @@ static int nxp_c45_get_features(struct phy_device *phydev)
return genphy_c45_pma_read_abilities(phydev);
}

static int nxp_c45_parse_dt(struct phy_device *phydev)
{
struct device_node *node = phydev->mdio.dev.of_node;
struct nxp_c45_phy *priv = phydev->priv;

if (!IS_ENABLED(CONFIG_OF_MDIO))
return 0;

if (of_property_read_bool(node, "nxp,rmii-refclk-out"))
priv->flags |= TJA11XX_REVERSE_MODE;

return 0;
}

static int nxp_c45_probe(struct phy_device *phydev)
{
struct nxp_c45_phy *priv;
Expand All @@ -1642,6 +1668,8 @@ static int nxp_c45_probe(struct phy_device *phydev)

phydev->priv = priv;

nxp_c45_parse_dt(phydev);

mutex_init(&priv->ptp_lock);

phy_abilities = phy_read_mmd(phydev, MDIO_MMD_VEND1,
Expand Down
1 change: 1 addition & 0 deletions drivers/net/phy/nxp-c45-tja11xx.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ struct nxp_c45_phy {
int extts_index;
bool extts;
struct nxp_c45_macsec *macsec;
u32 flags;
};

#if IS_ENABLED(CONFIG_MACSEC)
Expand Down

0 comments on commit 6d8d898

Please sign in to comment.