97 lines
3.1 KiB
Diff
97 lines
3.1 KiB
Diff
|
From 62866e98737e77c87f9dec99edea76ab54360770 Mon Sep 17 00:00:00 2001
|
||
|
From: Chen-Yu Tsai <wens@csie.org>
|
||
|
Date: Fri, 17 Jan 2014 21:24:40 +0800
|
||
|
Subject: [PATCH] net: stmmac: Enable stmmac main clock when probing hardware
|
||
|
|
||
|
The stmmac driver does not enable the main clock during the probe phase.
|
||
|
If the clock was not enabled by the boot loader or was disabled by the
|
||
|
kernel, hardware features and the MDIO bus would not be probed properly.
|
||
|
|
||
|
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
|
||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||
|
---
|
||
|
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 26 +++++++++++------------
|
||
|
1 file changed, 13 insertions(+), 13 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
||
|
index cddcf76..0d2c4cb 100644
|
||
|
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
||
|
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
||
|
@@ -1680,8 +1680,6 @@ static int stmmac_open(struct net_device *dev)
|
||
|
struct stmmac_priv *priv = netdev_priv(dev);
|
||
|
int ret;
|
||
|
|
||
|
- clk_prepare_enable(priv->stmmac_clk);
|
||
|
-
|
||
|
stmmac_check_ether_addr(priv);
|
||
|
|
||
|
if (priv->pcs != STMMAC_PCS_RGMII && priv->pcs != STMMAC_PCS_TBI &&
|
||
|
@@ -1819,7 +1817,6 @@ static int stmmac_release(struct net_device *dev)
|
||
|
#ifdef CONFIG_STMMAC_DEBUG_FS
|
||
|
stmmac_exit_fs();
|
||
|
#endif
|
||
|
- clk_disable_unprepare(priv->stmmac_clk);
|
||
|
|
||
|
stmmac_release_ptp(priv);
|
||
|
|
||
|
@@ -2727,10 +2724,18 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,
|
||
|
if ((phyaddr >= 0) && (phyaddr <= 31))
|
||
|
priv->plat->phy_addr = phyaddr;
|
||
|
|
||
|
+ priv->stmmac_clk = devm_clk_get(priv->device, STMMAC_RESOURCE_NAME);
|
||
|
+ if (IS_ERR(priv->stmmac_clk)) {
|
||
|
+ dev_warn(priv->device, "%s: warning: cannot get CSR clock\n",
|
||
|
+ __func__);
|
||
|
+ goto error_clk_get;
|
||
|
+ }
|
||
|
+ clk_prepare_enable(priv->stmmac_clk);
|
||
|
+
|
||
|
/* Init MAC and get the capabilities */
|
||
|
ret = stmmac_hw_init(priv);
|
||
|
if (ret)
|
||
|
- goto error_free_netdev;
|
||
|
+ goto error_hw_init;
|
||
|
|
||
|
ndev->netdev_ops = &stmmac_netdev_ops;
|
||
|
|
||
|
@@ -2768,12 +2773,6 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,
|
||
|
goto error_netdev_register;
|
||
|
}
|
||
|
|
||
|
- priv->stmmac_clk = clk_get(priv->device, STMMAC_RESOURCE_NAME);
|
||
|
- if (IS_ERR(priv->stmmac_clk)) {
|
||
|
- pr_warn("%s: warning: cannot get CSR clock\n", __func__);
|
||
|
- goto error_clk_get;
|
||
|
- }
|
||
|
-
|
||
|
/* If a specific clk_csr value is passed from the platform
|
||
|
* this means that the CSR Clock Range selection cannot be
|
||
|
* changed at run-time and it is fixed. Viceversa the driver'll try to
|
||
|
@@ -2801,12 +2800,12 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,
|
||
|
return priv;
|
||
|
|
||
|
error_mdio_register:
|
||
|
- clk_put(priv->stmmac_clk);
|
||
|
-error_clk_get:
|
||
|
unregister_netdev(ndev);
|
||
|
error_netdev_register:
|
||
|
netif_napi_del(&priv->napi);
|
||
|
-error_free_netdev:
|
||
|
+error_hw_init:
|
||
|
+ clk_disable_unprepare(priv->stmmac_clk);
|
||
|
+error_clk_get:
|
||
|
free_netdev(ndev);
|
||
|
|
||
|
return NULL;
|
||
|
@@ -2833,6 +2832,7 @@ int stmmac_dvr_remove(struct net_device *ndev)
|
||
|
stmmac_mdio_unregister(ndev);
|
||
|
netif_carrier_off(ndev);
|
||
|
unregister_netdev(ndev);
|
||
|
+ clk_disable_unprepare(priv->stmmac_clk);
|
||
|
free_netdev(ndev);
|
||
|
|
||
|
return 0;
|
||
|
--
|
||
|
1.8.5.5
|
||
|
|