]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
net: fec: don't disable enet_out clock
authorLothar Waßmann <LW@KARO-electronics.de>
Tue, 18 Aug 2015 16:51:30 +0000 (18:51 +0200)
committerLothar Waßmann <LW@KARO-electronics.de>
Tue, 3 Nov 2015 10:57:45 +0000 (11:57 +0100)
ENET_OUT is an optional clock which may be used as reference clock for
an ethernet PHY. Switching the clock off may adversely affect the
function of the PHY (experienced with an SMSC LAN8710A).

Conflicts:
drivers/net/ethernet/freescale/fec_main.c

drivers/net/ethernet/freescale/fec_main.c

index b2a32209ffbfc2806d725d7924b470d2752e03d5..f3a43ce4c209b0c28b0059c601c4910a12441b6d 100644 (file)
@@ -1857,11 +1857,6 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)
                ret = clk_prepare_enable(fep->clk_ahb);
                if (ret)
                        return ret;
-               if (fep->clk_enet_out) {
-                       ret = clk_prepare_enable(fep->clk_enet_out);
-                       if (ret)
-                               goto failed_clk_enet_out;
-               }
                if (fep->clk_ptp) {
                        mutex_lock(&fep->ptp_clk_mutex);
                        ret = clk_prepare_enable(fep->clk_ptp);
@@ -1873,35 +1868,26 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)
                        }
                        mutex_unlock(&fep->ptp_clk_mutex);
                }
-               if (fep->clk_ref) {
-                       ret = clk_prepare_enable(fep->clk_ref);
-                       if (ret)
-                               goto failed_clk_ref;
-               }
+               ret = clk_prepare_enable(fep->clk_ref);
+               if (ret)
+                       goto failed_clk_ref;
        } else {
                clk_disable_unprepare(fep->clk_ahb);
-               if (fep->clk_enet_out)
-                       clk_disable_unprepare(fep->clk_enet_out);
                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);
                }
-               if (fep->clk_ref)
-                       clk_disable_unprepare(fep->clk_ref);
+               clk_disable_unprepare(fep->clk_ref);
        }
 
        return 0;
 
 failed_clk_ref:
-       if (fep->clk_ref)
-               clk_disable_unprepare(fep->clk_ref);
+       clk_disable_unprepare(fep->clk_ref);
 failed_clk_ptp:
-       if (fep->clk_enet_out)
-               clk_disable_unprepare(fep->clk_enet_out);
-failed_clk_enet_out:
-               clk_disable_unprepare(fep->clk_ahb);
+       clk_disable_unprepare(fep->clk_ahb);
 
        return ret;
 }
@@ -3434,6 +3420,10 @@ fec_probe(struct platform_device *pdev)
        if (ret)
                goto failed_clk_ipg;
 
+       ret = clk_prepare_enable(fep->clk_enet_out);
+       if (ret)
+               goto failed_clk_enet_out;
+
        fep->reg_phy = devm_regulator_get(&pdev->dev, "phy");
        if (!IS_ERR(fep->reg_phy)) {
                ret = regulator_enable(fep->reg_phy);
@@ -3514,6 +3504,8 @@ failed_init:
        if (fep->reg_phy)
                regulator_disable(fep->reg_phy);
 failed_regulator:
+       clk_disable_unprepare(fep->clk_enet_out);
+failed_clk_enet_out:
        clk_disable_unprepare(fep->clk_ipg);
 failed_clk_ipg:
        fec_enet_clk_enable(ndev, false);
@@ -3538,6 +3530,9 @@ fec_drv_remove(struct platform_device *pdev)
        fec_enet_mii_remove(fep);
        if (fep->reg_phy)
                regulator_disable(fep->reg_phy);
+       fec_enet_clk_enable(ndev, false);
+       clk_disable_unprepare(fep->clk_enet_out);
+       clk_disable_unprepare(fep->clk_ipg);
        of_node_put(fep->phy_node);
        free_netdev(ndev);