Skip to content

Commit

Permalink
net: ftgmac100: Ungate RCLK for RMII on ASPEED MACs
Browse files Browse the repository at this point in the history
The 50MHz RCLK has to be enabled before the RMII interface will function.

Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
Reviewed-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Andrew Jeffery authored and David S. Miller committed Oct 12, 2019
1 parent 042b867 commit 9bce4b2
Showing 1 changed file with 40 additions and 10 deletions.
50 changes: 40 additions & 10 deletions drivers/net/ethernet/faraday/ftgmac100.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@ struct ftgmac100 {
struct mii_bus *mii_bus;
struct clk *clk;

/* AST2500/AST2600 RMII ref clock gate */
struct clk *rclk;

/* Link management */
int cur_speed;
int cur_duplex;
Expand Down Expand Up @@ -1718,20 +1721,41 @@ static void ftgmac100_ncsi_handler(struct ncsi_dev *nd)
nd->link_up ? "up" : "down");
}

static void ftgmac100_setup_clk(struct ftgmac100 *priv)
static int ftgmac100_setup_clk(struct ftgmac100 *priv)
{
priv->clk = devm_clk_get(priv->dev, NULL);
if (IS_ERR(priv->clk))
return;
struct clk *clk;
int rc;

clk_prepare_enable(priv->clk);
clk = devm_clk_get(priv->dev, NULL /* MACCLK */);
if (IS_ERR(clk))
return PTR_ERR(clk);
priv->clk = clk;
rc = clk_prepare_enable(priv->clk);
if (rc)
return rc;

/* Aspeed specifies a 100MHz clock is required for up to
* 1000Mbit link speeds. As NCSI is limited to 100Mbit, 25MHz
* is sufficient
*/
clk_set_rate(priv->clk, priv->use_ncsi ? FTGMAC_25MHZ :
FTGMAC_100MHZ);
rc = clk_set_rate(priv->clk, priv->use_ncsi ? FTGMAC_25MHZ :
FTGMAC_100MHZ);
if (rc)
goto cleanup_clk;

/* RCLK is for RMII, typically used for NCSI. Optional because its not
* necessary if it's the AST2400 MAC, or the MAC is configured for
* RGMII, or the controller is not an ASPEED-based controller.
*/
priv->rclk = devm_clk_get_optional(priv->dev, "RCLK");
rc = clk_prepare_enable(priv->rclk);
if (!rc)
return 0;

cleanup_clk:
clk_disable_unprepare(priv->clk);

return rc;
}

static int ftgmac100_probe(struct platform_device *pdev)
Expand Down Expand Up @@ -1853,8 +1877,11 @@ static int ftgmac100_probe(struct platform_device *pdev)
goto err_setup_mdio;
}

if (priv->is_aspeed)
ftgmac100_setup_clk(priv);
if (priv->is_aspeed) {
err = ftgmac100_setup_clk(priv);
if (err)
goto err_ncsi_dev;
}

/* Default ring sizes */
priv->rx_q_entries = priv->new_rx_q_entries = DEF_RX_QUEUE_ENTRIES;
Expand Down Expand Up @@ -1886,8 +1913,10 @@ static int ftgmac100_probe(struct platform_device *pdev)

return 0;

err_ncsi_dev:
err_register_netdev:
clk_disable_unprepare(priv->rclk);
clk_disable_unprepare(priv->clk);
err_ncsi_dev:
ftgmac100_destroy_mdio(netdev);
err_setup_mdio:
iounmap(priv->base);
Expand All @@ -1909,6 +1938,7 @@ static int ftgmac100_remove(struct platform_device *pdev)

unregister_netdev(netdev);

clk_disable_unprepare(priv->rclk);
clk_disable_unprepare(priv->clk);

/* There's a small chance the reset task will have been re-queued,
Expand Down

0 comments on commit 9bce4b2

Please sign in to comment.