[U-Boot] [PATCH v2 3/4] net/ftgmac100: Add NC-SI mode support
Cédric Le Goater
clg at kaod.org
Tue Jun 18 08:31:26 UTC 2019
On 18/06/2019 03:37, Samuel Mendoza-Jonas wrote:
> Update the ftgmac100 driver to support NC-SI instead of an mdio phy
> where available. This is a common setup for Aspeed AST2x00 platforms.
>
> NC-SI mode is determined from the device-tree if either phy-mode sets it
> or the use-ncsi property exists. If set then normal mdio setup is
> skipped in favour of the NC-SI phy.
>
> Signed-off-by: Samuel Mendoza-Jonas <sam at mendozajonas.com>
LGTM. Some very minor remarks below in case you resend.
Reviewed-by: Cédric Le Goater <clg at kaod.org>
Thanks,
C.
> ---
> drivers/net/ftgmac100.c | 39 +++++++++++++++++++++++++++++----------
> 1 file changed, 29 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/net/ftgmac100.c b/drivers/net/ftgmac100.c
> index 92c38a81bd..c0100e91c7 100644
> --- a/drivers/net/ftgmac100.c
> +++ b/drivers/net/ftgmac100.c
> @@ -18,6 +18,7 @@
> #include <wait_bit.h>
> #include <linux/io.h>
> #include <linux/iopoll.h>
> +#include <net/ncsi.h>
>
> #include "ftgmac100.h"
>
> @@ -81,6 +82,7 @@ struct ftgmac100_data {
> struct mii_dev *bus;
> u32 phy_mode;
> u32 max_speed;
> + bool ncsi_mode;
>
> struct clk_bulk clks;
>
> @@ -181,7 +183,7 @@ static int ftgmac100_phy_adjust_link(struct ftgmac100_data *priv)
> struct phy_device *phydev = priv->phydev;
> u32 maccr;
>
> - if (!phydev->link) {
> + if (!phydev->link && !priv->ncsi_mode) {
> dev_err(phydev->dev, "No link\n");
> return -EREMOTEIO;
> }
> @@ -217,7 +219,8 @@ static int ftgmac100_phy_init(struct udevice *dev)
> if (!phydev)
> return -ENODEV;
>
> - phydev->supported &= PHY_GBIT_FEATURES;
> + if (!priv->ncsi_mode)
> + phydev->supported &= PHY_GBIT_FEATURES;
> if (priv->max_speed) {
> ret = phy_set_supported(phydev, priv->max_speed);
> if (ret)
> @@ -275,7 +278,8 @@ static void ftgmac100_stop(struct udevice *dev)
>
> writel(0, &ftgmac100->maccr);
>
> - phy_shutdown(priv->phydev);
> + if (!priv->ncsi_mode)
> + phy_shutdown(priv->phydev);
> }
>
> static int ftgmac100_start(struct udevice *dev)
> @@ -513,6 +517,7 @@ static int ftgmac100_ofdata_to_platdata(struct udevice *dev)
> pdata->iobase = devfdt_get_addr(dev);
> pdata->phy_interface = -1;
> phy_mode = dev_read_string(dev, "phy-mode");
> +
> if (phy_mode)
> pdata->phy_interface = phy_get_interface_by_name(phy_mode);
> if (pdata->phy_interface == -1) {
> @@ -537,8 +542,13 @@ static int ftgmac100_probe(struct udevice *dev)
> {
> struct eth_pdata *pdata = dev_get_platdata(dev);
> struct ftgmac100_data *priv = dev_get_priv(dev);
> + const char *phy_mode;
> int ret;
>
> + phy_mode = dev_read_string(dev, "phy-mode");
> + priv->ncsi_mode = dev_read_bool(dev, "use-ncsi") ||
> + (phy_mode && strcmp(phy_mode, "NC-SI") == 0);
strncmp() may be ? I think a helper routine would make sense.
> +
> priv->iobase = (struct ftgmac100 *)pdata->iobase;
> priv->phy_mode = pdata->phy_interface;
> priv->max_speed = pdata->max_speed;
> @@ -548,10 +558,15 @@ static int ftgmac100_probe(struct udevice *dev)
> if (ret)
> goto out;
>
> - ret = ftgmac100_mdio_init(dev);
> - if (ret) {
> - dev_err(dev, "Failed to initialize mdiobus: %d\n", ret);
> - goto out;
> + if (priv->ncsi_mode) {
> + printf("%s - NCSI detected\n", __func__);
"NC-SI"
> + } else {
> + ret = ftgmac100_mdio_init(dev);
> + if (ret) {
> + dev_err(dev, "Failed to initialize mdiobus: %d\n", ret);
> + goto out;
> + }
> +
> }
>
> ret = ftgmac100_phy_init(dev);
> @@ -571,9 +586,13 @@ static int ftgmac100_remove(struct udevice *dev)
> {
> struct ftgmac100_data *priv = dev_get_priv(dev);
>
> - free(priv->phydev);
> - mdio_unregister(priv->bus);
> - mdio_free(priv->bus);
> + if (!priv->ncsi_mode) {
> + free(priv->phydev);
> + mdio_unregister(priv->bus);
> + mdio_free(priv->bus);
> + } else {
> + free(priv->phydev);
> + }
> clk_release_bulk(&priv->clks);
>
> return 0;
>
More information about the U-Boot
mailing list