diff options
Diffstat (limited to 'target/linux/sunxi/patches-3.13/153-1-stmmac-enable-main-clock-when-probing.patch')
-rw-r--r-- | target/linux/sunxi/patches-3.13/153-1-stmmac-enable-main-clock-when-probing.patch | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/target/linux/sunxi/patches-3.13/153-1-stmmac-enable-main-clock-when-probing.patch b/target/linux/sunxi/patches-3.13/153-1-stmmac-enable-main-clock-when-probing.patch new file mode 100644 index 0000000..e8137fb --- /dev/null +++ b/target/linux/sunxi/patches-3.13/153-1-stmmac-enable-main-clock-when-probing.patch @@ -0,0 +1,96 @@ +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 + |