[U-Boot] [PATCH 1/3] net: ravb: Add OF probing support

Add support for probing the RAVB Ethernet block from device tree.
Signed-off-by: Marek Vasut marek.vasut+renesas@gmail.com Cc: Joe Hershberger joe.hershberger@ni.com Cc: Nobuhiro Iwamatsu iwamatsu@nigauri.org --- drivers/net/ravb.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
diff --git a/drivers/net/ravb.c b/drivers/net/ravb.c index ab45a31d6a..7f0e2568b7 100644 --- a/drivers/net/ravb.c +++ b/drivers/net/ravb.c @@ -589,9 +589,46 @@ static const struct eth_ops ravb_ops = { .write_hwaddr = ravb_write_hwaddr, };
+int ravb_ofdata_to_platdata(struct udevice *dev) +{ + struct eth_pdata *pdata = dev_get_platdata(dev); + const char *phy_mode; + const fdt32_t *cell; + int ret = 0; + + pdata->iobase = devfdt_get_addr(dev); + pdata->phy_interface = -1; + phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode", + NULL); + if (phy_mode) + pdata->phy_interface = phy_get_interface_by_name(phy_mode); + if (pdata->phy_interface == -1) { + debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode); + return -EINVAL; + } + + pdata->max_speed = 1000; + cell = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "max-speed", NULL); + if (cell) + pdata->max_speed = fdt32_to_cpu(*cell); + + sprintf(bb_miiphy_buses[0].name, dev->name); + + return ret; +} + +static const struct udevice_id ravb_ids[] = { + { .compatible = "renesas,etheravb-r8a7795" }, + { .compatible = "renesas,etheravb-r8a7796" }, + { .compatible = "renesas,etheravb-rcar-gen3" }, + { } +}; + U_BOOT_DRIVER(eth_ravb) = { .name = "ravb", .id = UCLASS_ETH, + .of_match = ravb_ids, + .ofdata_to_platdata = ravb_ofdata_to_platdata, .probe = ravb_probe, .remove = ravb_remove, .ops = &ravb_ops,

The order of parameters passed to the phy_connect() was wrong. Moreover, only PHY address 0 was used. Replace this with code capable of detecting the PHY address.
Signed-off-by: Marek Vasut marek.vasut+renesas@gmail.com Cc: Joe Hershberger joe.hershberger@ni.com Cc: Nobuhiro Iwamatsu iwamatsu@nigauri.org --- drivers/net/ravb.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ravb.c b/drivers/net/ravb.c index 7f0e2568b7..ce0eacceb6 100644 --- a/drivers/net/ravb.c +++ b/drivers/net/ravb.c @@ -298,13 +298,14 @@ static int ravb_phy_config(struct udevice *dev) struct ravb_priv *eth = dev_get_priv(dev); struct eth_pdata *pdata = dev_get_platdata(dev); struct phy_device *phydev; - int reg; + int mask = 0xffffffff, reg;
- phydev = phy_connect(eth->bus, pdata->phy_interface, - dev, PHY_INTERFACE_MODE_RGMII_ID); + phydev = phy_find_by_mask(eth->bus, mask, pdata->phy_interface); if (!phydev) return -ENODEV;
+ phy_connect_dev(phydev, dev); + eth->phydev = phydev;
/* 10BASE is not supported for Ethernet AVB MAC */

On Fri, Jul 21, 2017 at 4:20 PM, Marek Vasut marek.vasut@gmail.com wrote:
The order of parameters passed to the phy_connect() was wrong. Moreover, only PHY address 0 was used. Replace this with code capable of detecting the PHY address.
Signed-off-by: Marek Vasut marek.vasut+renesas@gmail.com Cc: Joe Hershberger joe.hershberger@ni.com Cc: Nobuhiro Iwamatsu iwamatsu@nigauri.org
Acked-by: Joe Hershberger joe.hershberger@ni.com

Applied to rmobile branch, thanks!
2017-07-22 6:20 GMT+09:00 Marek Vasut marek.vasut@gmail.com:
The order of parameters passed to the phy_connect() was wrong. Moreover, only PHY address 0 was used. Replace this with code capable of detecting the PHY address.
Signed-off-by: Marek Vasut marek.vasut+renesas@gmail.com Cc: Joe Hershberger joe.hershberger@ni.com Cc: Nobuhiro Iwamatsu iwamatsu@nigauri.org
drivers/net/ravb.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ravb.c b/drivers/net/ravb.c index 7f0e2568b7..ce0eacceb6 100644 --- a/drivers/net/ravb.c +++ b/drivers/net/ravb.c @@ -298,13 +298,14 @@ static int ravb_phy_config(struct udevice *dev) struct ravb_priv *eth = dev_get_priv(dev); struct eth_pdata *pdata = dev_get_platdata(dev); struct phy_device *phydev;
int reg;
int mask = 0xffffffff, reg;
phydev = phy_connect(eth->bus, pdata->phy_interface,
dev, PHY_INTERFACE_MODE_RGMII_ID);
phydev = phy_find_by_mask(eth->bus, mask, pdata->phy_interface); if (!phydev) return -ENODEV;
phy_connect_dev(phydev, dev);
eth->phydev = phydev; /* 10BASE is not supported for Ethernet AVB MAC */
-- 2.11.0

Add support for enabling and disabling the clock using the clock framework based on the content of OF instead of doing it manually in the board file.
Signed-off-by: Marek Vasut marek.vasut+renesas@gmail.com Cc: Joe Hershberger joe.hershberger@ni.com Cc: Nobuhiro Iwamatsu iwamatsu@nigauri.org --- drivers/net/ravb.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ravb.c b/drivers/net/ravb.c index ce0eacceb6..8db127ba06 100644 --- a/drivers/net/ravb.c +++ b/drivers/net/ravb.c @@ -10,6 +10,7 @@ */
#include <common.h> +#include <clk.h> #include <dm.h> #include <errno.h> #include <miiphy.h> @@ -120,6 +121,7 @@ struct ravb_priv { struct phy_device *phydev; struct mii_dev *bus; void __iomem *iobase; + struct clk clk; };
static inline void ravb_flush_dcache(u32 addr, u32 len) @@ -432,27 +434,38 @@ int ravb_start(struct udevice *dev) struct ravb_priv *eth = dev_get_priv(dev); int ret;
- ret = ravb_reset(dev); + ret = clk_enable(ð->clk); if (ret) return ret;
+ ret = ravb_reset(dev); + if (ret) + goto err; + ravb_base_desc_init(eth); ravb_tx_desc_init(eth); ravb_rx_desc_init(eth);
ret = ravb_config(dev); if (ret) - return ret; + goto err;
/* Setting the control will start the AVB-DMAC process. */ writel(CCC_OPC_OPERATION, eth->iobase + RAVB_REG_CCC);
return 0; + +err: + clk_disable(ð->clk); + return ret; }
static void ravb_stop(struct udevice *dev) { + struct ravb_priv *eth = dev_get_priv(dev); + ravb_reset(dev); + clk_disable(ð->clk); }
static int ravb_probe(struct udevice *dev) @@ -466,6 +479,10 @@ static int ravb_probe(struct udevice *dev) iobase = map_physmem(pdata->iobase, 0x1000, MAP_NOCACHE); eth->iobase = iobase;
+ ret = clk_get_by_index(dev, 0, ð->clk); + if (ret < 0) + goto err_mdio_alloc; + mdiodev = mdio_alloc(); if (!mdiodev) { ret = -ENOMEM;

On Fri, Jul 21, 2017 at 4:20 PM, Marek Vasut marek.vasut@gmail.com wrote:
Add support for enabling and disabling the clock using the clock framework based on the content of OF instead of doing it manually in the board file.
Signed-off-by: Marek Vasut marek.vasut+renesas@gmail.com Cc: Joe Hershberger joe.hershberger@ni.com Cc: Nobuhiro Iwamatsu iwamatsu@nigauri.org
Acked-by: Joe Hershberger joe.hershberger@ni.com

Applied to rmobile branch, thanks!
2017-07-22 6:20 GMT+09:00 Marek Vasut marek.vasut@gmail.com:
Add support for enabling and disabling the clock using the clock framework based on the content of OF instead of doing it manually in the board file.
Signed-off-by: Marek Vasut marek.vasut+renesas@gmail.com Cc: Joe Hershberger joe.hershberger@ni.com Cc: Nobuhiro Iwamatsu iwamatsu@nigauri.org
drivers/net/ravb.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ravb.c b/drivers/net/ravb.c index ce0eacceb6..8db127ba06 100644 --- a/drivers/net/ravb.c +++ b/drivers/net/ravb.c @@ -10,6 +10,7 @@ */
#include <common.h> +#include <clk.h> #include <dm.h> #include <errno.h> #include <miiphy.h> @@ -120,6 +121,7 @@ struct ravb_priv { struct phy_device *phydev; struct mii_dev *bus; void __iomem *iobase;
struct clk clk;
};
static inline void ravb_flush_dcache(u32 addr, u32 len) @@ -432,27 +434,38 @@ int ravb_start(struct udevice *dev) struct ravb_priv *eth = dev_get_priv(dev); int ret;
ret = ravb_reset(dev);
ret = clk_enable(ð->clk); if (ret) return ret;
ret = ravb_reset(dev);
if (ret)
goto err;
ravb_base_desc_init(eth); ravb_tx_desc_init(eth); ravb_rx_desc_init(eth); ret = ravb_config(dev); if (ret)
return ret;
goto err; /* Setting the control will start the AVB-DMAC process. */ writel(CCC_OPC_OPERATION, eth->iobase + RAVB_REG_CCC); return 0;
+err:
clk_disable(ð->clk);
return ret;
}
static void ravb_stop(struct udevice *dev) {
struct ravb_priv *eth = dev_get_priv(dev);
ravb_reset(dev);
clk_disable(ð->clk);
}
static int ravb_probe(struct udevice *dev) @@ -466,6 +479,10 @@ static int ravb_probe(struct udevice *dev) iobase = map_physmem(pdata->iobase, 0x1000, MAP_NOCACHE); eth->iobase = iobase;
ret = clk_get_by_index(dev, 0, ð->clk);
if (ret < 0)
goto err_mdio_alloc;
mdiodev = mdio_alloc(); if (!mdiodev) { ret = -ENOMEM;
-- 2.11.0

On Fri, Jul 21, 2017 at 4:20 PM, Marek Vasut marek.vasut@gmail.com wrote:
Add support for probing the RAVB Ethernet block from device tree.
Signed-off-by: Marek Vasut marek.vasut+renesas@gmail.com Cc: Joe Hershberger joe.hershberger@ni.com Cc: Nobuhiro Iwamatsu iwamatsu@nigauri.org
Acked-by: Joe Hershberger joe.hershberger@ni.com

Applied to rmobile branch, thanks!
2017-07-22 6:20 GMT+09:00 Marek Vasut marek.vasut@gmail.com:
Add support for probing the RAVB Ethernet block from device tree.
Signed-off-by: Marek Vasut marek.vasut+renesas@gmail.com Cc: Joe Hershberger joe.hershberger@ni.com Cc: Nobuhiro Iwamatsu iwamatsu@nigauri.org
drivers/net/ravb.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
diff --git a/drivers/net/ravb.c b/drivers/net/ravb.c index ab45a31d6a..7f0e2568b7 100644 --- a/drivers/net/ravb.c +++ b/drivers/net/ravb.c @@ -589,9 +589,46 @@ static const struct eth_ops ravb_ops = { .write_hwaddr = ravb_write_hwaddr, };
+int ravb_ofdata_to_platdata(struct udevice *dev) +{
struct eth_pdata *pdata = dev_get_platdata(dev);
const char *phy_mode;
const fdt32_t *cell;
int ret = 0;
pdata->iobase = devfdt_get_addr(dev);
pdata->phy_interface = -1;
phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode",
NULL);
if (phy_mode)
pdata->phy_interface = phy_get_interface_by_name(phy_mode);
if (pdata->phy_interface == -1) {
debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
return -EINVAL;
}
pdata->max_speed = 1000;
cell = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "max-speed", NULL);
if (cell)
pdata->max_speed = fdt32_to_cpu(*cell);
sprintf(bb_miiphy_buses[0].name, dev->name);
return ret;
+}
+static const struct udevice_id ravb_ids[] = {
{ .compatible = "renesas,etheravb-r8a7795" },
{ .compatible = "renesas,etheravb-r8a7796" },
{ .compatible = "renesas,etheravb-rcar-gen3" },
{ }
+};
U_BOOT_DRIVER(eth_ravb) = { .name = "ravb", .id = UCLASS_ETH,
.of_match = ravb_ids,
.ofdata_to_platdata = ravb_ofdata_to_platdata, .probe = ravb_probe, .remove = ravb_remove, .ops = &ravb_ops,
-- 2.11.0
participants (3)
-
Joe Hershberger
-
Marek Vasut
-
Nobuhiro Iwamatsu