Commit 6d8d8987 authored by Wei Fang's avatar Wei Fang Committed by Paolo Abeni
Browse files

net: phy: c45-tja11xx: add support for outputting RMII reference clock



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: default avatarWei Fang <wei.fang@nxp.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 09277e4f
Loading
Loading
Loading
Loading
+29 −1
Original line number Diff line number Diff line
@@ -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>
@@ -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 {
@@ -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);
@@ -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)) {
@@ -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;
@@ -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,
+1 −0
Original line number Diff line number Diff line
@@ -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)