[PATCH 1/2] net: phy: Factor out PHY GPIO reset code

Ramon Fried rfried.dev at gmail.com
Sat Jul 22 10:21:42 CEST 2023


On Tue, Jun 20, 2023 at 1:46 AM Marek Vasut
<marek.vasut+renesas at mailbox.org> wrote:
>
> Pull the PHY GPIO reset code into separate function, since
> this is and will be reused multiple times. Set up default
> reset assert and deassert timing to generous 20ms and 1ms
> for maximum compatibility in case those DT properties are
> missing.
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
> ---
> Cc: Joe Hershberger <joe.hershberger at ni.com>
> Cc: Marek Vasut <marek.vasut+renesas at mailbox.org>
> Cc: Michal Simek <michal.simek at amd.com>
> Cc: Nishanth Menon <nm at ti.com>
> Cc: Ramon Fried <rfried.dev at gmail.com>
> ---
>  drivers/net/phy/ethernet_id.c | 37 ++++-----------------------
>  drivers/net/phy/phy.c         | 47 +++++++++++++++++++++++++++++++++++
>  include/phy.h                 |  9 +++++++
>  3 files changed, 61 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/net/phy/ethernet_id.c b/drivers/net/phy/ethernet_id.c
> index 877a51c3d00..0beafaae46a 100644
> --- a/drivers/net/phy/ethernet_id.c
> +++ b/drivers/net/phy/ethernet_id.c
> @@ -18,12 +18,11 @@ struct phy_device *phy_connect_phy_id(struct mii_dev *bus, struct udevice *dev,
>  {
>         struct phy_device *phydev;
>         struct ofnode_phandle_args phandle_args;
> -       struct gpio_desc gpio;
>         const char *node_name;
>         struct udevice *pdev;
> -       ofnode node;
> -       u32 id, assert, deassert;
>         u16 vendor, device;
> +       ofnode node;
> +       u32 id;
>         int ret;
>
>         if (dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0,
> @@ -41,35 +40,9 @@ struct phy_device *phy_connect_phy_id(struct mii_dev *bus, struct udevice *dev,
>                 return NULL;
>         }
>
> -       if (!IS_ENABLED(CONFIG_DM_ETH_PHY)) {
> -               ret = gpio_request_by_name_nodev(node, "reset-gpios", 0, &gpio,
> -                                                GPIOD_IS_OUT | GPIOD_ACTIVE_LOW);
> -               if (!ret) {
> -                       assert = ofnode_read_u32_default(node,
> -                                                        "reset-assert-us", 0);
> -                       deassert = ofnode_read_u32_default(node,
> -                                                          "reset-deassert-us",
> -                                                          0);
> -                       ret = dm_gpio_set_value(&gpio, 1);
> -                       if (ret) {
> -                               dev_err(dev,
> -                                       "Failed assert gpio, err: %d\n", ret);
> -                               return NULL;
> -                       }
> -
> -                       udelay(assert);
> -
> -                       ret = dm_gpio_set_value(&gpio, 0);
> -                       if (ret) {
> -                               dev_err(dev,
> -                                       "Failed deassert gpio, err: %d\n",
> -                                       ret);
> -                               return NULL;
> -                       }
> -
> -                       udelay(deassert);
> -               }
> -       }
> +       ret = phy_gpio_reset(dev);
> +       if (ret)
> +               return NULL;
>
>         id =  vendor << 16 | device;
>         phydev = phy_device_create(bus, phyaddr, id, false);
> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
> index ae21acb059b..3d69c2c4d28 100644
> --- a/drivers/net/phy/phy.c
> +++ b/drivers/net/phy/phy.c
> @@ -18,6 +18,8 @@
>  #include <phy.h>
>  #include <errno.h>
>  #include <asm/global_data.h>
> +#include <asm/gpio.h>
> +#include <dm/device_compat.h>
>  #include <dm/of_extra.h>
>  #include <linux/bitops.h>
>  #include <linux/delay.h>
> @@ -799,6 +801,51 @@ int miiphy_reset(const char *devname, unsigned char addr)
>         return phy_reset(phydev);
>  }
>
> +int phy_gpio_reset(struct udevice *dev)
> +{
> +       struct ofnode_phandle_args phandle_args;
> +       struct gpio_desc gpio;
> +       u32 assert, deassert;
> +       ofnode node;
> +       int ret;
> +
> +       ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0,
> +                                        &phandle_args);
> +       /* No PHY handle is OK */
> +       if (ret)
> +               return 0;
> +
> +       node = phandle_args.node;
> +       if (!ofnode_valid(node))
> +               return -EINVAL;
> +
> +       ret = gpio_request_by_name_nodev(node, "reset-gpios", 0, &gpio,
> +                                        GPIOD_IS_OUT | GPIOD_ACTIVE_LOW);
> +       /* No PHY reset GPIO is OK */
> +       if (ret)
> +               return 0;
> +
> +       assert = ofnode_read_u32_default(node, "reset-assert-us", 20000);
> +       deassert = ofnode_read_u32_default(node, "reset-deassert-us", 1000);
> +       ret = dm_gpio_set_value(&gpio, 1);
> +       if (ret) {
> +               dev_err(dev, "Failed assert gpio, err: %d\n", ret);
> +               return ret;
> +       }
> +
> +       udelay(assert);
> +
> +       ret = dm_gpio_set_value(&gpio, 0);
> +       if (ret) {
> +               dev_err(dev, "Failed deassert gpio, err: %d\n", ret);
> +               return ret;
> +       }
> +
> +       udelay(deassert);
> +
> +       return 0;
> +}
> +
>  struct phy_device *phy_find_by_mask(struct mii_dev *bus, uint phy_mask)
>  {
>         /* Reset the bus */
> diff --git a/include/phy.h b/include/phy.h
> index f023a3c2685..6fe397be1fe 100644
> --- a/include/phy.h
> +++ b/include/phy.h
> @@ -188,6 +188,15 @@ int phy_init(void);
>   */
>  int phy_reset(struct phy_device *phydev);
>
> +/**
> + * phy_gpio_reset() - Resets the specified PHY using GPIO reset
> + * Toggles the optional PHY reset GPIO
> + *
> + * @dev:       PHY udevice to reset
> + * @return: 0 if OK, -ve on error
> + */
> +int phy_gpio_reset(struct udevice *dev);
> +
>  /**
>   * phy_find_by_mask() - Searches for a PHY on the specified MDIO bus
>   * The function checks the PHY addresses flagged in phy_mask and returns a
> --
> 2.39.2
>
Reviewed-by: Ramon Fried <rfried.dev at gmail.com>


More information about the U-Boot mailing list