[PATCH v2] net: phy: Factor out PHY GPIO reset code

Michal Simek michal.simek at amd.com
Mon Mar 18 09:46:50 CET 2024



On 3/17/24 04:11, Marek Vasut 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.
> 
> Reviewed-by: Ramon Fried <rfried.dev at gmail.com>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
> ---
> Cc: Joe Hershberger <joe.hershberger at ni.com>
> Cc: Michal Simek <michal.simek at amd.com>
> Cc: Nishanth Menon <nm at ti.com>
> Cc: Ramon Fried <rfried.dev at gmail.com>
> ---
> V2: - Fix am335x_evm build with OF_REAL disabled
>      - Collect RB from Ramon
> ---
>   drivers/net/phy/ethernet_id.c | 37 +++-------------------
>   drivers/net/phy/phy.c         | 58 +++++++++++++++++++++++++++++++++++
>   include/phy.h                 |  9 ++++++
>   3 files changed, 72 insertions(+), 32 deletions(-)
> 
> diff --git a/drivers/net/phy/ethernet_id.c b/drivers/net/phy/ethernet_id.c
> index 6cb1fd4453e..4dfdee60dcc 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;
>   
>   	if (phyaddr == -1)
>   		phyaddr = ofnode_read_u32_default(phandle_args.node, "reg", -1);
> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
> index 63b3e46f101..9ceb7d7c6a1 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-generic/gpio.h>
> +#include <dm/device_compat.h>
>   #include <dm/of_extra.h>
>   #include <linux/bitops.h>
>   #include <linux/delay.h>
> @@ -768,6 +770,62 @@ int miiphy_reset(const char *devname, unsigned char addr)
>   	return phy_reset(phydev);
>   }
>   
> +#if CONFIG_IS_ENABLED(DM_GPIO) && CONFIG_IS_ENABLED(OF_REAL) && \
> +    !IS_ENABLED(CONFIG_DM_ETH_PHY)
> +int phy_gpio_reset(struct udevice *dev)
> +{
> +	struct ofnode_phandle_args phandle_args;
> +	struct gpio_desc gpio;
> +	u32 assert, deassert;
> +	ofnode node;
> +	int ret;
> +
> +	if (IS_ENABLED(CONFIG_DM_ETH_PHY))
> +		return 0;

Trying to wrap my head around this condition. Above you have 
!IS_ENABLED(CONFIG_DM_ETH_PHY) and here IS_ENABLED(CONFIG_DM_ETH_PHY).

Thanks,
Michal


More information about the U-Boot mailing list