[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