diff options
| author | Florian Fainelli <f.fainelli@gmail.com> | 2014-08-11 17:50:42 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-08-11 18:10:11 -0400 |
| commit | e4a60a93c4a6e7dd4e3e82736b932375598a26fd (patch) | |
| tree | 96ec0dcda6a0bb9535bc5a13bdb55ddb229be97e | |
| parent | 8dff81e87d5c2867d7401f8ee7b1eb3e3aa2ba8d (diff) | |
net: bcmgenet: request and enable main clock earlier
bcmgenet_set_hw_params() will read the hardware version and compare it
with the one we are getting from Device Tree. Due to the clock being
enabled too late, bcmgenet_set_hw_params() will cause bus errors since
the GENET hardware block is still gated off by the time
bcmgenet_set_hw_params() is called, this will also make us fail the
version check since we will read the value 0 from the hardware.
Fix this by requesting the clock before the first piece of code that
needs to access hardware register.
Fixes: 1c1008c793fa4 ("net: bcmgenet: add main driver file")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/ethernet/broadcom/genet/bcmgenet.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index ce455aed5a2f..7a3661c090ee 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | |||
| @@ -2533,6 +2533,13 @@ static int bcmgenet_probe(struct platform_device *pdev) | |||
| 2533 | priv->pdev = pdev; | 2533 | priv->pdev = pdev; |
| 2534 | priv->version = (enum bcmgenet_version)of_id->data; | 2534 | priv->version = (enum bcmgenet_version)of_id->data; |
| 2535 | 2535 | ||
| 2536 | priv->clk = devm_clk_get(&priv->pdev->dev, "enet"); | ||
| 2537 | if (IS_ERR(priv->clk)) | ||
| 2538 | dev_warn(&priv->pdev->dev, "failed to get enet clock\n"); | ||
| 2539 | |||
| 2540 | if (!IS_ERR(priv->clk)) | ||
| 2541 | clk_prepare_enable(priv->clk); | ||
| 2542 | |||
| 2536 | bcmgenet_set_hw_params(priv); | 2543 | bcmgenet_set_hw_params(priv); |
| 2537 | 2544 | ||
| 2538 | /* Mii wait queue */ | 2545 | /* Mii wait queue */ |
| @@ -2541,17 +2548,10 @@ static int bcmgenet_probe(struct platform_device *pdev) | |||
| 2541 | priv->rx_buf_len = RX_BUF_LENGTH; | 2548 | priv->rx_buf_len = RX_BUF_LENGTH; |
| 2542 | INIT_WORK(&priv->bcmgenet_irq_work, bcmgenet_irq_task); | 2549 | INIT_WORK(&priv->bcmgenet_irq_work, bcmgenet_irq_task); |
| 2543 | 2550 | ||
| 2544 | priv->clk = devm_clk_get(&priv->pdev->dev, "enet"); | ||
| 2545 | if (IS_ERR(priv->clk)) | ||
| 2546 | dev_warn(&priv->pdev->dev, "failed to get enet clock\n"); | ||
| 2547 | |||
| 2548 | priv->clk_wol = devm_clk_get(&priv->pdev->dev, "enet-wol"); | 2551 | priv->clk_wol = devm_clk_get(&priv->pdev->dev, "enet-wol"); |
| 2549 | if (IS_ERR(priv->clk_wol)) | 2552 | if (IS_ERR(priv->clk_wol)) |
| 2550 | dev_warn(&priv->pdev->dev, "failed to get enet-wol clock\n"); | 2553 | dev_warn(&priv->pdev->dev, "failed to get enet-wol clock\n"); |
| 2551 | 2554 | ||
| 2552 | if (!IS_ERR(priv->clk)) | ||
| 2553 | clk_prepare_enable(priv->clk); | ||
| 2554 | |||
| 2555 | err = reset_umac(priv); | 2555 | err = reset_umac(priv); |
| 2556 | if (err) | 2556 | if (err) |
| 2557 | goto err_clk_disable; | 2557 | goto err_clk_disable; |
