Skip to content

Commit

Permalink
net: phy: broadcom: Add Broadcom PTP hooks to bcm-phy-lib
Browse files Browse the repository at this point in the history
Add 'struct bcm_ptp_private' to bcm54xx_phy_priv which points to
an optional PTP structure attached to the PHY.  This is allocated
on probe if PHY PTP support is configured, and if the driver supports
PTP for the specified PHY.

Add the bcm_ptp_probe(), bcm_ptp_config_init() and bcn_ptp_stop()
API functions to the bcm-phy library.

Signed-off-by: Jonathan Lemon <jonathan.lemon@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Jonathan Lemon authored and Jakub Kicinski committed Jun 24, 2022
1 parent 0aeaaa8 commit 15acf89
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 4 deletions.
19 changes: 19 additions & 0 deletions drivers/net/phy/bcm-phy-lib.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,23 @@ int bcm_phy_cable_test_start_rdb(struct phy_device *phydev);
int bcm_phy_cable_test_start(struct phy_device *phydev);
int bcm_phy_cable_test_get_status(struct phy_device *phydev, bool *finished);

#if IS_ENABLED(CONFIG_BCM_NET_PHYPTP)
struct bcm_ptp_private *bcm_ptp_probe(struct phy_device *phydev);
void bcm_ptp_config_init(struct phy_device *phydev);
void bcm_ptp_stop(struct bcm_ptp_private *priv);
#else
static inline struct bcm_ptp_private *bcm_ptp_probe(struct phy_device *phydev)
{
return NULL;
}

static inline void bcm_ptp_config_init(struct phy_device *phydev)
{
}

static inline void bcm_ptp_stop(struct bcm_ptp_private *priv)
{
}
#endif

#endif /* _LINUX_BCM_PHY_LIB_H */
33 changes: 29 additions & 4 deletions drivers/net/phy/broadcom.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ MODULE_DESCRIPTION("Broadcom PHY driver");
MODULE_AUTHOR("Maciej W. Rozycki");
MODULE_LICENSE("GPL");

struct bcm54xx_phy_priv {
u64 *stats;
struct bcm_ptp_private *ptp;
};

static int bcm54xx_config_clock_delay(struct phy_device *phydev)
{
int rc, val;
Expand Down Expand Up @@ -313,6 +318,22 @@ static void bcm54xx_adjust_rxrefclk(struct phy_device *phydev)
bcm_phy_write_shadow(phydev, BCM54XX_SHD_APD, val);
}

static void bcm54xx_ptp_stop(struct phy_device *phydev)
{
struct bcm54xx_phy_priv *priv = phydev->priv;

if (priv->ptp)
bcm_ptp_stop(priv->ptp);
}

static void bcm54xx_ptp_config_init(struct phy_device *phydev)
{
struct bcm54xx_phy_priv *priv = phydev->priv;

if (priv->ptp)
bcm_ptp_config_init(phydev);
}

static int bcm54xx_config_init(struct phy_device *phydev)
{
int reg, err, val;
Expand Down Expand Up @@ -390,6 +411,8 @@ static int bcm54xx_config_init(struct phy_device *phydev)
bcm_phy_write_exp(phydev, BCM_EXP_MULTICOLOR, val);
}

bcm54xx_ptp_config_init(phydev);

return 0;
}

Expand Down Expand Up @@ -418,6 +441,8 @@ static int bcm54xx_suspend(struct phy_device *phydev)
{
int ret;

bcm54xx_ptp_stop(phydev);

/* We cannot use a read/modify/write here otherwise the PHY gets into
* a bad state where its LEDs keep flashing, thus defeating the purpose
* of low power mode.
Expand Down Expand Up @@ -741,10 +766,6 @@ static irqreturn_t brcm_fet_handle_interrupt(struct phy_device *phydev)
return IRQ_HANDLED;
}

struct bcm54xx_phy_priv {
u64 *stats;
};

static int bcm54xx_phy_probe(struct phy_device *phydev)
{
struct bcm54xx_phy_priv *priv;
Expand All @@ -761,6 +782,10 @@ static int bcm54xx_phy_probe(struct phy_device *phydev)
if (!priv->stats)
return -ENOMEM;

priv->ptp = bcm_ptp_probe(phydev);
if (IS_ERR(priv->ptp))
return PTR_ERR(priv->ptp);

return 0;
}

Expand Down

0 comments on commit 15acf89

Please sign in to comment.