--- /dev/null
+From 32cba57ba74be58589aeb4cb6496183e46a5e3e5 Mon Sep 17 00:00:00 2001
+From: Lucas Stach <l.stach@pengutronix.de>
+Date: Thu, 23 Jul 2015 16:06:20 +0200
+Subject: net: fec: introduce fec_ptp_stop and use in probe fail path
+
+From: Lucas Stach <l.stach@pengutronix.de>
+
+commit 32cba57ba74be58589aeb4cb6496183e46a5e3e5 upstream.
+
+This function frees resources and cancels delayed work item that
+have been initialized in fec_ptp_init().
+
+Use this to do proper error handling if something goes wrong in
+probe function after fec_ptp_init has been called.
+
+Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
+Acked-by: Fugang Duan <B38611@freescale.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+[groeck: backport: context changes in .../fec_main.c]
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/ethernet/freescale/fec.h | 1 +
+ drivers/net/ethernet/freescale/fec_main.c | 5 ++---
+ drivers/net/ethernet/freescale/fec_ptp.c | 10 ++++++++++
+ 3 files changed, 13 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/ethernet/freescale/fec.h
++++ b/drivers/net/ethernet/freescale/fec.h
+@@ -546,6 +546,7 @@ struct fec_enet_private {
+ };
+
+ void fec_ptp_init(struct platform_device *pdev);
++void fec_ptp_stop(struct platform_device *pdev);
+ void fec_ptp_start_cyclecounter(struct net_device *ndev);
+ int fec_ptp_set(struct net_device *ndev, struct ifreq *ifr);
+ int fec_ptp_get(struct net_device *ndev, struct ifreq *ifr);
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -3312,6 +3312,7 @@ failed_register:
+ failed_mii_init:
+ failed_irq:
+ failed_init:
++ fec_ptp_stop(pdev);
+ if (fep->reg_phy)
+ regulator_disable(fep->reg_phy);
+ failed_regulator:
+@@ -3331,14 +3332,12 @@ fec_drv_remove(struct platform_device *p
+ struct net_device *ndev = platform_get_drvdata(pdev);
+ struct fec_enet_private *fep = netdev_priv(ndev);
+
+- cancel_delayed_work_sync(&fep->time_keep);
+ cancel_work_sync(&fep->tx_timeout_work);
++ fec_ptp_stop(pdev);
+ unregister_netdev(ndev);
+ fec_enet_mii_remove(fep);
+ if (fep->reg_phy)
+ regulator_disable(fep->reg_phy);
+- if (fep->ptp_clock)
+- ptp_clock_unregister(fep->ptp_clock);
+ fec_enet_clk_enable(ndev, false);
+ of_node_put(fep->phy_node);
+ free_netdev(ndev);
+--- a/drivers/net/ethernet/freescale/fec_ptp.c
++++ b/drivers/net/ethernet/freescale/fec_ptp.c
+@@ -620,6 +620,16 @@ void fec_ptp_init(struct platform_device
+ schedule_delayed_work(&fep->time_keep, HZ);
+ }
+
++void fec_ptp_stop(struct platform_device *pdev)
++{
++ struct net_device *ndev = platform_get_drvdata(pdev);
++ struct fec_enet_private *fep = netdev_priv(ndev);
++
++ cancel_delayed_work_sync(&fep->time_keep);
++ if (fep->ptp_clock)
++ ptp_clock_unregister(fep->ptp_clock);
++}
++
+ /**
+ * fec_ptp_check_pps_event
+ * @fep: the fec_enet_private structure handle