Commit 20922486 authored by Sebastian Hesselbarth's avatar Sebastian Hesselbarth Committed by David S. Miller

net: mv643xx_eth: add shared clk and cleanup existing clk handling

This patch adds an optional shared block clock to avoid lockups on
clock gated controllers. Besides the new clock, clock handling for
existing clocks is cleaned up and moved to devm_clk_get. Device
tree binding documentation is updated for the new clocks property.
Signed-off-by: default avatarSebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b8075daf
...@@ -115,6 +115,9 @@ prefixed with the string "marvell,", for Marvell Technology Group Ltd. ...@@ -115,6 +115,9 @@ prefixed with the string "marvell,", for Marvell Technology Group Ltd.
- compatible : "marvell,mv64360-eth-block" - compatible : "marvell,mv64360-eth-block"
- reg : Offset and length of the register set for this block - reg : Offset and length of the register set for this block
Optional properties:
- clocks : Phandle to the clock control device and gate bit
Example Discovery Ethernet block node: Example Discovery Ethernet block node:
ethernet-block@2000 { ethernet-block@2000 {
#address-cells = <1>; #address-cells = <1>;
......
...@@ -268,7 +268,7 @@ struct mv643xx_eth_shared_private { ...@@ -268,7 +268,7 @@ struct mv643xx_eth_shared_private {
int extended_rx_coal_limit; int extended_rx_coal_limit;
int tx_bw_control; int tx_bw_control;
int tx_csum_limit; int tx_csum_limit;
struct clk *clk;
}; };
#define TX_BW_CONTROL_ABSENT 0 #define TX_BW_CONTROL_ABSENT 0
...@@ -410,9 +410,7 @@ struct mv643xx_eth_private { ...@@ -410,9 +410,7 @@ struct mv643xx_eth_private {
/* /*
* Hardware-specific parameters. * Hardware-specific parameters.
*/ */
#if defined(CONFIG_HAVE_CLK)
struct clk *clk; struct clk *clk;
#endif
unsigned int t_clk; unsigned int t_clk;
}; };
...@@ -2569,6 +2567,10 @@ static int mv643xx_eth_shared_probe(struct platform_device *pdev) ...@@ -2569,6 +2567,10 @@ static int mv643xx_eth_shared_probe(struct platform_device *pdev)
if (msp->base == NULL) if (msp->base == NULL)
goto out_free; goto out_free;
msp->clk = devm_clk_get(&pdev->dev, NULL);
if (!IS_ERR(msp->clk))
clk_prepare_enable(msp->clk);
/* /*
* (Re-)program MBUS remapping windows if we are asked to. * (Re-)program MBUS remapping windows if we are asked to.
*/ */
...@@ -2595,6 +2597,8 @@ static int mv643xx_eth_shared_remove(struct platform_device *pdev) ...@@ -2595,6 +2597,8 @@ static int mv643xx_eth_shared_remove(struct platform_device *pdev)
struct mv643xx_eth_shared_private *msp = platform_get_drvdata(pdev); struct mv643xx_eth_shared_private *msp = platform_get_drvdata(pdev);
iounmap(msp->base); iounmap(msp->base);
if (!IS_ERR(msp->clk))
clk_disable_unprepare(msp->clk);
kfree(msp); kfree(msp);
return 0; return 0;
...@@ -2801,13 +2805,12 @@ static int mv643xx_eth_probe(struct platform_device *pdev) ...@@ -2801,13 +2805,12 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
* it to override the default. * it to override the default.
*/ */
mp->t_clk = 133000000; mp->t_clk = 133000000;
#if defined(CONFIG_HAVE_CLK) mp->clk = devm_clk_get(&pdev->dev, NULL);
mp->clk = clk_get(&pdev->dev, (pdev->id ? "1" : "0"));
if (!IS_ERR(mp->clk)) { if (!IS_ERR(mp->clk)) {
clk_prepare_enable(mp->clk); clk_prepare_enable(mp->clk);
mp->t_clk = clk_get_rate(mp->clk); mp->t_clk = clk_get_rate(mp->clk);
} }
#endif
set_params(mp, pd); set_params(mp, pd);
netif_set_real_num_tx_queues(dev, mp->txq_count); netif_set_real_num_tx_queues(dev, mp->txq_count);
netif_set_real_num_rx_queues(dev, mp->rxq_count); netif_set_real_num_rx_queues(dev, mp->rxq_count);
...@@ -2889,12 +2892,8 @@ static int mv643xx_eth_probe(struct platform_device *pdev) ...@@ -2889,12 +2892,8 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
return 0; return 0;
out: out:
#if defined(CONFIG_HAVE_CLK) if (!IS_ERR(mp->clk))
if (!IS_ERR(mp->clk)) {
clk_disable_unprepare(mp->clk); clk_disable_unprepare(mp->clk);
clk_put(mp->clk);
}
#endif
free_netdev(dev); free_netdev(dev);
return err; return err;
...@@ -2909,12 +2908,8 @@ static int mv643xx_eth_remove(struct platform_device *pdev) ...@@ -2909,12 +2908,8 @@ static int mv643xx_eth_remove(struct platform_device *pdev)
phy_detach(mp->phy); phy_detach(mp->phy);
cancel_work_sync(&mp->tx_timeout_task); cancel_work_sync(&mp->tx_timeout_task);
#if defined(CONFIG_HAVE_CLK) if (!IS_ERR(mp->clk))
if (!IS_ERR(mp->clk)) {
clk_disable_unprepare(mp->clk); clk_disable_unprepare(mp->clk);
clk_put(mp->clk);
}
#endif
free_netdev(mp->dev); free_netdev(mp->dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment