net: bcmgenet: request and enable main clock earlier
authorFlorian Fainelli <f.fainelli@gmail.com>
Mon, 11 Aug 2014 21:50:42 +0000 (14:50 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 11 Aug 2014 22:10:11 +0000 (15:10 -0700)
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>
drivers/net/ethernet/broadcom/genet/bcmgenet.c

index ce455aed5a2f557067e479632553ca461450a7dd..7a3661c090ee67a9145693c6f26964e6c3be00ff 100644 (file)
@@ -2533,6 +2533,13 @@ static int bcmgenet_probe(struct platform_device *pdev)
        priv->pdev = pdev;
        priv->version = (enum bcmgenet_version)of_id->data;
 
+       priv->clk = devm_clk_get(&priv->pdev->dev, "enet");
+       if (IS_ERR(priv->clk))
+               dev_warn(&priv->pdev->dev, "failed to get enet clock\n");
+
+       if (!IS_ERR(priv->clk))
+               clk_prepare_enable(priv->clk);
+
        bcmgenet_set_hw_params(priv);
 
        /* Mii wait queue */
@@ -2541,17 +2548,10 @@ static int bcmgenet_probe(struct platform_device *pdev)
        priv->rx_buf_len = RX_BUF_LENGTH;
        INIT_WORK(&priv->bcmgenet_irq_work, bcmgenet_irq_task);
 
-       priv->clk = devm_clk_get(&priv->pdev->dev, "enet");
-       if (IS_ERR(priv->clk))
-               dev_warn(&priv->pdev->dev, "failed to get enet clock\n");
-
        priv->clk_wol = devm_clk_get(&priv->pdev->dev, "enet-wol");
        if (IS_ERR(priv->clk_wol))
                dev_warn(&priv->pdev->dev, "failed to get enet-wol clock\n");
 
-       if (!IS_ERR(priv->clk))
-               clk_prepare_enable(priv->clk);
-
        err = reset_umac(priv);
        if (err)
                goto err_clk_disable;