Re: [PATCH linux dev-5.3 5/6] net: ftgmac100: Ungate RCLK for RMII on AST2600
Andrew Jeffery
andrew at aj.id.au
Mon Sep 23 16:26:06 AEST 2019
On Mon, 23 Sep 2019, at 15:42, Cédric Le Goater wrote:
> On 22/09/2019 14:36, Andrew Jeffery wrote:
> > The 50MHz RMII RCLK has to be enabled before the interface will function.
> >
> > Signed-off-by: Andrew Jeffery <andrew at aj.id.au>
> > ---
> > drivers/net/ethernet/faraday/ftgmac100.c | 43 ++++++++++++++++++++----
> > 1 file changed, 36 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
> > index 9b7af94a40bb..21a58aad1a19 100644
> > --- a/drivers/net/ethernet/faraday/ftgmac100.c
> > +++ b/drivers/net/ethernet/faraday/ftgmac100.c
> > @@ -90,6 +90,9 @@ struct ftgmac100 {
> > struct mii_bus *mii_bus;
> > struct clk *clk;
> >
> > + /* 2600 RMII clock gate */
> > + struct clk *rclk;
> > +
> > /* Link management */
> > int cur_speed;
> > int cur_duplex;
> > @@ -1718,11 +1721,27 @@ 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;
> > + bool is_ast2600;
> > +
> > + is_ast2600 = of_device_is_compatible(priv->dev->of_node,
> > + "aspeed,ast2600-mac");
>
> why is ast2600 particular ?
It isn't, as Joel pointed out. We need this for at least the 2500 as well, but I didn't think to check as u-boot has been leaving the clock ungated.
>
> > + clk = devm_clk_get(priv->dev, NULL /* MACCLK */);
> > + if (IS_ERR(clk))
> > + return PTR_ERR(clk);
> > + priv->clk = clk;
> > +
> > + clk = devm_clk_get_optional(priv->dev, "RCLK");
> > + if (!clk && is_ast2600 && priv->use_ncsi) {
> > + dev_err(priv->dev, "Cannot ungate RCLK");
> > + return -EINVAL;
> > + }
> > +
> > + priv->rclk = clk;
> > + clk_prepare_enable(priv->rclk);
> >
> > clk_prepare_enable(priv->clk);
> >
> > @@ -1732,6 +1751,8 @@ static void ftgmac100_setup_clk(struct ftgmac100 *priv)
> > */
> > clk_set_rate(priv->clk, priv->use_ncsi ? FTGMAC_25MHZ :
> > FTGMAC_100MHZ);
> > +
> > + return 0;
> > }
> >
> > static int ftgmac100_probe(struct platform_device *pdev)
> > @@ -1853,8 +1874,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 +1910,11 @@ static int ftgmac100_probe(struct platform_device *pdev)
> >
> > return 0;
> >
> > -err_ncsi_dev:
> > err_register_netdev:
> > + if (priv->rclk)
> > + 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 +1936,8 @@ static int ftgmac100_remove(struct platform_device *pdev)
> >
> > unregister_netdev(netdev);
> >
> > + if (priv->rclk)
> > + clk_disable_unprepare(priv->rclk);
> > clk_disable_unprepare(priv->clk);
> >
> > /* There's a small chance the reset task will have been re-queued,
> >
>
>
More information about the openbmc
mailing list