diff options
Diffstat (limited to 'drivers/net/ethernet/freescale/fec_main.c')
| -rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 32 | 
1 files changed, 22 insertions, 10 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 697c2427f2b7..aa7d4e27c5d1 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1655,7 +1655,7 @@ static void fec_get_mac(struct net_device *ndev)  		struct device_node *np = fep->pdev->dev.of_node;  		if (np) {  			const char *mac = of_get_mac_address(np); -			if (mac) +			if (!IS_ERR(mac))  				iap = (unsigned char *) mac;  		}  	} @@ -1840,13 +1840,9 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)  	int ret;  	if (enable) { -		ret = clk_prepare_enable(fep->clk_ahb); -		if (ret) -			return ret; -  		ret = clk_prepare_enable(fep->clk_enet_out);  		if (ret) -			goto failed_clk_enet_out; +			return ret;  		if (fep->clk_ptp) {  			mutex_lock(&fep->ptp_clk_mutex); @@ -1866,7 +1862,6 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)  		phy_reset_after_clk_enable(ndev->phydev);  	} else { -		clk_disable_unprepare(fep->clk_ahb);  		clk_disable_unprepare(fep->clk_enet_out);  		if (fep->clk_ptp) {  			mutex_lock(&fep->ptp_clk_mutex); @@ -1885,8 +1880,6 @@ failed_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);  	return ret;  } @@ -3470,6 +3463,9 @@ fec_probe(struct platform_device *pdev)  	ret = clk_prepare_enable(fep->clk_ipg);  	if (ret)  		goto failed_clk_ipg; +	ret = clk_prepare_enable(fep->clk_ahb); +	if (ret) +		goto failed_clk_ahb;  	fep->reg_phy = devm_regulator_get_optional(&pdev->dev, "phy");  	if (!IS_ERR(fep->reg_phy)) { @@ -3563,6 +3559,9 @@ failed_reset:  	pm_runtime_put(&pdev->dev);  	pm_runtime_disable(&pdev->dev);  failed_regulator: +	clk_disable_unprepare(fep->clk_ahb); +failed_clk_ahb: +	clk_disable_unprepare(fep->clk_ipg);  failed_clk_ipg:  	fec_enet_clk_enable(ndev, false);  failed_clk: @@ -3686,6 +3685,7 @@ static int __maybe_unused fec_runtime_suspend(struct device *dev)  	struct net_device *ndev = dev_get_drvdata(dev);  	struct fec_enet_private *fep = netdev_priv(ndev); +	clk_disable_unprepare(fep->clk_ahb);  	clk_disable_unprepare(fep->clk_ipg);  	return 0; @@ -3695,8 +3695,20 @@ static int __maybe_unused fec_runtime_resume(struct device *dev)  {  	struct net_device *ndev = dev_get_drvdata(dev);  	struct fec_enet_private *fep = netdev_priv(ndev); +	int ret; -	return clk_prepare_enable(fep->clk_ipg); +	ret = clk_prepare_enable(fep->clk_ahb); +	if (ret) +		return ret; +	ret = clk_prepare_enable(fep->clk_ipg); +	if (ret) +		goto failed_clk_ipg; + +	return 0; + +failed_clk_ipg: +	clk_disable_unprepare(fep->clk_ahb); +	return ret;  }  static const struct dev_pm_ops fec_pm_ops = {  |