Skip to content

Commit

Permalink
net: fec: add phy-reset-gpios PROBE_DEFER check
Browse files Browse the repository at this point in the history
Many boards use i2c/spi expander gpio as phy-reset-gpios and these
gpios maybe registered after fec port, driver should check the return
value of .of_get_named_gpio().

Signed-off-by: Fugang Duan <B38611@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Fugang Duan authored and David S. Miller committed Apr 11, 2017
1 parent 9492012 commit 9269e55
Showing 1 changed file with 18 additions and 8 deletions.
26 changes: 18 additions & 8 deletions drivers/net/ethernet/freescale/fec_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3187,24 +3187,26 @@ static int fec_enet_init(struct net_device *ndev)
}

#ifdef CONFIG_OF
static void fec_reset_phy(struct platform_device *pdev)
static int fec_reset_phy(struct platform_device *pdev)
{
int err, phy_reset;
bool active_high = false;
int msec = 1;
struct device_node *np = pdev->dev.of_node;

if (!np)
return;
return 0;

err = of_property_read_u32(np, "phy-reset-duration", &msec);
/* A sane reset duration should not be longer than 1s */
if (!err && msec > 1000)
msec = 1;

phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0);
if (!gpio_is_valid(phy_reset))
return;
if (phy_reset == -EPROBE_DEFER)
return phy_reset;
else if (!gpio_is_valid(phy_reset))
return 0;

active_high = of_property_read_bool(np, "phy-reset-active-high");

Expand All @@ -3213,7 +3215,7 @@ static void fec_reset_phy(struct platform_device *pdev)
"phy-reset");
if (err) {
dev_err(&pdev->dev, "failed to get phy-reset-gpios: %d\n", err);
return;
return err;
}

if (msec > 20)
Expand All @@ -3222,14 +3224,17 @@ static void fec_reset_phy(struct platform_device *pdev)
usleep_range(msec * 1000, msec * 1000 + 1000);

gpio_set_value_cansleep(phy_reset, !active_high);

return 0;
}
#else /* CONFIG_OF */
static void fec_reset_phy(struct platform_device *pdev)
static int fec_reset_phy(struct platform_device *pdev)
{
/*
* In case of platform probe, the reset has been done
* by machine code.
*/
return 0;
}
#endif /* CONFIG_OF */

Expand Down Expand Up @@ -3400,6 +3405,7 @@ fec_probe(struct platform_device *pdev)
if (ret) {
dev_err(&pdev->dev,
"Failed to enable phy regulator: %d\n", ret);
clk_disable_unprepare(fep->clk_ipg);
goto failed_regulator;
}
} else {
Expand All @@ -3412,7 +3418,9 @@ fec_probe(struct platform_device *pdev)
pm_runtime_set_active(&pdev->dev);
pm_runtime_enable(&pdev->dev);

fec_reset_phy(pdev);
ret = fec_reset_phy(pdev);
if (ret)
goto failed_reset;

if (fep->bufdesc_ex)
fec_ptp_init(pdev);
Expand Down Expand Up @@ -3473,8 +3481,10 @@ fec_probe(struct platform_device *pdev)
fec_ptp_stop(pdev);
if (fep->reg_phy)
regulator_disable(fep->reg_phy);
failed_reset:
pm_runtime_put(&pdev->dev);
pm_runtime_disable(&pdev->dev);
failed_regulator:
clk_disable_unprepare(fep->clk_ipg);
failed_clk_ipg:
fec_enet_clk_enable(ndev, false);
failed_clk:
Expand Down

0 comments on commit 9269e55

Please sign in to comment.