[PATCH net-next 1/2] net: phy: smsc: export functions for use by meson-gxl PHY driver

Chris Healy cphealy at gmail.com
Sun Mar 19 17:39:51 PDT 2023


On a dev board with SMSC LAN8720, this change was tested and confirmed
to still operate normally.

Signed-off-by: Chris Healy <healych at amazon.com>

On Sat, Mar 18, 2023 at 1:36 PM Heiner Kallweit <hkallweit1 at gmail.com> wrote:
>
> The Amlogic Meson internal PHY's have the same register layout as
> certain SMSC PHY's (also for non-c22-standard registers). This seems
> to be more than just coincidence. Apparently they also need the same
> workaround for EDPD mode (energy detect power down). Therefore let's
> export SMSC PHY driver functionality for use by the meson-gxl PHY
> driver.
>
> Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
> ---
>  drivers/net/phy/smsc.c  | 20 +++++++++++++-------
>  include/linux/smscphy.h |  6 ++++++
>  2 files changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c
> index 721871184..730964b85 100644
> --- a/drivers/net/phy/smsc.c
> +++ b/drivers/net/phy/smsc.c
> @@ -54,7 +54,7 @@ static int smsc_phy_ack_interrupt(struct phy_device *phydev)
>         return rc < 0 ? rc : 0;
>  }
>
> -static int smsc_phy_config_intr(struct phy_device *phydev)
> +int smsc_phy_config_intr(struct phy_device *phydev)
>  {
>         int rc;
>
> @@ -75,8 +75,9 @@ static int smsc_phy_config_intr(struct phy_device *phydev)
>
>         return rc < 0 ? rc : 0;
>  }
> +EXPORT_SYMBOL_GPL(smsc_phy_config_intr);
>
> -static irqreturn_t smsc_phy_handle_interrupt(struct phy_device *phydev)
> +irqreturn_t smsc_phy_handle_interrupt(struct phy_device *phydev)
>  {
>         int irq_status;
>
> @@ -95,18 +96,20 @@ static irqreturn_t smsc_phy_handle_interrupt(struct phy_device *phydev)
>
>         return IRQ_HANDLED;
>  }
> +EXPORT_SYMBOL_GPL(smsc_phy_handle_interrupt);
>
> -static int smsc_phy_config_init(struct phy_device *phydev)
> +int smsc_phy_config_init(struct phy_device *phydev)
>  {
>         struct smsc_phy_priv *priv = phydev->priv;
>
> -       if (!priv->energy_enable || phydev->irq != PHY_POLL)
> +       if (!priv || !priv->energy_enable || phydev->irq != PHY_POLL)
>                 return 0;
>
>         /* Enable energy detect power down mode */
>         return phy_set_bits(phydev, MII_LAN83C185_CTRL_STATUS,
>                             MII_LAN83C185_EDPWRDOWN);
>  }
> +EXPORT_SYMBOL_GPL(smsc_phy_config_init);
>
>  static int smsc_phy_reset(struct phy_device *phydev)
>  {
> @@ -186,7 +189,7 @@ static int lan95xx_config_aneg_ext(struct phy_device *phydev)
>   * The workaround is only applicable to poll mode. Energy Detect Power-Down may
>   * not be used in interrupt mode lest link change detection becomes unreliable.
>   */
> -static int lan87xx_read_status(struct phy_device *phydev)
> +int lan87xx_read_status(struct phy_device *phydev)
>  {
>         struct smsc_phy_priv *priv = phydev->priv;
>         int err;
> @@ -195,7 +198,8 @@ static int lan87xx_read_status(struct phy_device *phydev)
>         if (err)
>                 return err;
>
> -       if (!phydev->link && priv->energy_enable && phydev->irq == PHY_POLL) {
> +       if (!phydev->link && priv && priv->energy_enable &&
> +           phydev->irq == PHY_POLL) {
>                 /* Disable EDPD to wake up PHY */
>                 int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
>                 if (rc < 0)
> @@ -229,6 +233,7 @@ static int lan87xx_read_status(struct phy_device *phydev)
>
>         return err;
>  }
> +EXPORT_SYMBOL_GPL(lan87xx_read_status);
>
>  static int smsc_get_sset_count(struct phy_device *phydev)
>  {
> @@ -269,7 +274,7 @@ static void smsc_get_stats(struct phy_device *phydev,
>                 data[i] = smsc_get_stat(phydev, i);
>  }
>
> -static int smsc_phy_probe(struct phy_device *phydev)
> +int smsc_phy_probe(struct phy_device *phydev)
>  {
>         struct device *dev = &phydev->mdio.dev;
>         struct smsc_phy_priv *priv;
> @@ -294,6 +299,7 @@ static int smsc_phy_probe(struct phy_device *phydev)
>
>         return clk_set_rate(refclk, 50 * 1000 * 1000);
>  }
> +EXPORT_SYMBOL_GPL(smsc_phy_probe);
>
>  static struct phy_driver smsc_phy_driver[] = {
>  {
> diff --git a/include/linux/smscphy.h b/include/linux/smscphy.h
> index 1a136271b..80f37c1db 100644
> --- a/include/linux/smscphy.h
> +++ b/include/linux/smscphy.h
> @@ -28,4 +28,10 @@
>  #define MII_LAN83C185_MODE_POWERDOWN 0xC0 /* Power Down mode */
>  #define MII_LAN83C185_MODE_ALL       0xE0 /* All capable mode */
>
> +int smsc_phy_config_intr(struct phy_device *phydev);
> +irqreturn_t smsc_phy_handle_interrupt(struct phy_device *phydev);
> +int smsc_phy_config_init(struct phy_device *phydev);
> +int lan87xx_read_status(struct phy_device *phydev);
> +int smsc_phy_probe(struct phy_device *phydev);
> +
>  #endif /* __LINUX_SMSCPHY_H__ */
> --
> 2.39.2
>
>



More information about the linux-amlogic mailing list