Commit 9bce4b27 authored by Andrew Jeffery's avatar Andrew Jeffery Committed by David S. Miller
Browse files

net: ftgmac100: Ungate RCLK for RMII on ASPEED MACs



The 50MHz RCLK has to be enabled before the RMII interface will function.

Signed-off-by: default avatarAndrew Jeffery <andrew@aj.id.au>
Reviewed-by: default avatarJoel Stanley <joel@jms.id.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 042b8675
Loading
Loading
Loading
Loading
+40 −10
Original line number Diff line number Diff line
@@ -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;
@@ -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 :
	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)
@@ -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;
@@ -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);
@@ -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,