summaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/freescale/fec_main.c
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2014-09-05 16:53:56 +0200
committerArnd Bergmann <arnd@arndb.de>2014-09-05 16:53:56 +0200
commit184df9ddaab4a572e61b321abc079ca49155fc12 (patch)
tree5c99704d8508224b25552f24959b54772d8eec1e /drivers/net/ethernet/freescale/fec_main.c
parent647f95fa99b16e7c7854a202e91e6aa22ebeecf4 (diff)
parent13298fbbdb3f6a0ef55419dc048e064c7a7b0ef8 (diff)
Merge tag 'renesas-kconfig-cleanups-for-v3.18' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas into next/cleanup
Pull "Renesas ARM Based SoC Kconfig Cleanups for v3.18" from Simon Horman: * Update name of "R-Car M2-W" SoC (previously there was no "-W") * Consolidate Legacy SH_CLK_CPG and CPU_V7 Kconfig * Only select PM_RMOBILE for legacy case * Cleanup pm-rcar.o and pm-rmobile.o build using Kconfig Signed-off-by: Arnd Bergmann <arnd@arndb.de> * tag 'renesas-kconfig-cleanups-for-v3.18' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas: ARM: shmobile: r8a7791 is now called "R-Car M2-W" ARM: shmobile: Consolidate Legacy SH_CLK_CPG Kconfig ARM: shmobile: Consolidate Legacy CPU_V7 Kconfig ARM: shmobile: Only select PM_RMOBILE for legacy case ARM: shmobile: Cleanup pm-rmobile.o build using Kconfig ARM: shmobile: Cleanup pm-rcar.o build using Kconfig ARM: shmobile: Introduce a Kconfig entry for R-Car Gen2 ARM: shmobile: Introduce a Kconfig entry for R-Car Gen1 ARM: shmobile: Introduce a Kconfig entry for R-Mobile Includes an update to 3.17-rc2 to avoid a dependency
Diffstat (limited to 'drivers/net/ethernet/freescale/fec_main.c')
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 4f87dffcb9b..89355a71962 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1611,17 +1611,27 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)
goto failed_clk_enet_out;
}
if (fep->clk_ptp) {
+ mutex_lock(&fep->ptp_clk_mutex);
ret = clk_prepare_enable(fep->clk_ptp);
- if (ret)
+ if (ret) {
+ mutex_unlock(&fep->ptp_clk_mutex);
goto failed_clk_ptp;
+ } else {
+ fep->ptp_clk_on = true;
+ }
+ mutex_unlock(&fep->ptp_clk_mutex);
}
} else {
clk_disable_unprepare(fep->clk_ahb);
clk_disable_unprepare(fep->clk_ipg);
if (fep->clk_enet_out)
clk_disable_unprepare(fep->clk_enet_out);
- if (fep->clk_ptp)
+ if (fep->clk_ptp) {
+ mutex_lock(&fep->ptp_clk_mutex);
clk_disable_unprepare(fep->clk_ptp);
+ fep->ptp_clk_on = false;
+ mutex_unlock(&fep->ptp_clk_mutex);
+ }
}
return 0;
@@ -2625,6 +2635,8 @@ fec_probe(struct platform_device *pdev)
if (IS_ERR(fep->clk_enet_out))
fep->clk_enet_out = NULL;
+ fep->ptp_clk_on = false;
+ mutex_init(&fep->ptp_clk_mutex);
fep->clk_ptp = devm_clk_get(&pdev->dev, "ptp");
fep->bufdesc_ex =
pdev->id_entry->driver_data & FEC_QUIRK_HAS_BUFDESC_EX;
@@ -2715,10 +2727,10 @@ fec_drv_remove(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);
cancel_work_sync(&fep->tx_timeout_work);
unregister_netdev(ndev);
fec_enet_mii_remove(fep);
- del_timer_sync(&fep->time_keep);
if (fep->reg_phy)
regulator_disable(fep->reg_phy);
if (fep->ptp_clock)