Patch "net: fec: add phy-reset-gpios PROBE_DEFER check" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
net: fec: add phy-reset-gpios PROBE_DEFER check
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
net-fec-add-phy-reset-gpios-probe_defer-check.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Sun Mar 18 16:55:33 CET 2018
From: Fugang Duan <[email protected]>
Date: Tue, 11 Apr 2017 19:13:06 +0800
Subject: net: fec: add phy-reset-gpios PROBE_DEFER check
From: Fugang Duan <[email protected]>
[ Upstream commit 9269e5560b261eb9ee157497890dc0948db76cf8 ]
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().
--- drivers/net/ethernet/freescale/fec_main.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-)
drivers/net/ethernet/freescale/fec_main.c +18 -8
@@ -3209,7 +3209,7 @@ static int fec_enet_init(struct net_devi }#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;
@@ -3217,7 +3217,7 @@ static void fec_reset_phy(struct platforstruct device_node *np = pdev->dev.of_node;if (!np) -return ; +return 0 ;of_property_read_u32 (np,"phy-reset-duration" , &msec);/* A sane reset duration should not be longer than 1s */
@@ -3225,8 +3225,10 @@ static void fec_reset_phy(struct platfor 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" );
@@ -3235,7 +3237,7 @@ static void fec_reset_phy(struct platfor "phy-reset");if (err) {dev_err (&pdev->dev,"failed to get phy-reset-gpios: %d\n" , err); -return ; +return err; }if (msec >20 )
@@ -3244,14 +3246,17 @@ static void fec_reset_phy(struct platforusleep_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 */
@@ -3422,6 +3427,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 {
@@ -3434,7 +3440,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);
@@ -3495,8 +3503,10 @@ failed_init: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:
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/net-fec-add-phy-reset-gpios-probe_defer-check.patch