From 0b46274d42caca5d03e7c84bac088c437aeae954 Mon Sep 17 00:00:00 2001 From: Bitan Biswas Date: Thu, 21 May 2020 22:45:53 -0700 Subject: [PATCH] nvethernet : defer probe for reset gpio nvethernet comes up before gpio and hence reset gpio error below seen in galen boot log: ### [ 2.252546] nvethernet 2490000.ethernet: Adding to iommu group 0 [ 2.257577] nvethernet 2490000.ethernet: failed to get phy reset gpio [ 2.265533] nvethernet 2490000.ethernet: Ethernet MAC address: 00:04:4b:af:62:37 [ 2.271764] libphy: nvethernet_mdio_bus: probed [ 2.275940] mdio_bus 2490000.ethernet: MDIO device at address 0 is missing. [ 2.284469] nvethernet 2490000.ethernet: eth0 (HW ver: 50) created with 1 DMA channels [ 2.548104] GPIO line 510 (gpio_default) hogged as output/high [ 2.553598] GPIO line 511 (gpio_default) hogged as output/high [ 2.558156] gpiochip_setup_dev: registered GPIOs 504 to 511 on device: gpiochip0 (max77620-gpio) ## Returning -EPROBE_DEFER allows the driver initialization once gpio is initialized. Ethernet works fine in probe retry call once gpio is up. Hence, the defer probe is needed. bug 200617764 Change-Id: Icdcf0d7f0b69c564ecb0b142634b504287db3ea1 Signed-off-by: Bitan Biswas Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2348758 Tested-by: mobile promotions Reviewed-by: mobile promotions --- drivers/net/ethernet/nvidia/nvethernet/ether_linux.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c index a48078dd..2b388d6c 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c @@ -3430,8 +3430,13 @@ static int ether_configure_car(struct platform_device *pdev, /* get PHY reset */ pdata->phy_reset = of_get_named_gpio(np, "nvidia,phy-reset-gpio", 0); - if (pdata->phy_reset < 0) - dev_info(dev, "failed to get phy reset gpio\n"); + if (pdata->phy_reset < 0) { + if (pdata->phy_reset == -EPROBE_DEFER) + return pdata->phy_reset; + else + dev_info(dev, "failed to get phy reset gpio error: %d\n", + pdata->phy_reset); + } if (gpio_is_valid(pdata->phy_reset)) { ret = devm_gpio_request_one(dev, (unsigned int)pdata->phy_reset,