kernel: backport of changes & helpers
authorRafał Miłecki <rafal@milecki.pl>
Sat, 7 Jan 2023 15:59:14 +0000 (16:59 +0100)
committerRafał Miłecki <rafal@milecki.pl>
Sat, 7 Jan 2023 16:45:17 +0000 (17:45 +0100)
This code is required for upcoming NVMEM changes.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
20 files changed:
target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch [deleted file]
target/linux/generic/backport-5.10/732-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch [deleted file]
target/linux/generic/backport-5.10/732-v5.13-0003-of-base-Fix-some-formatting-issues-and-provide-missi.patch [new file with mode: 0644]
target/linux/generic/backport-5.10/732-v5.13-0005-of-Fix-kerneldoc-output-formatting.patch [new file with mode: 0644]
target/linux/generic/backport-5.10/732-v5.13-0006-of-Add-missing-Return-section-in-kerneldoc-comments.patch [new file with mode: 0644]
target/linux/generic/backport-5.10/732-v5.13-0007-of-base-Fix-spelling-issue-with-function-param-prop.patch [new file with mode: 0644]
target/linux/generic/backport-5.10/732-v5.13-0008-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch [new file with mode: 0644]
target/linux/generic/backport-5.10/732-v5.13-0009-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-de.patch [new file with mode: 0644]
target/linux/generic/backport-5.10/825-v5.15-of-unify-of_count_phandle_with_args-arguments-with-C.patch [new file with mode: 0644]
target/linux/generic/backport-5.10/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch [new file with mode: 0644]
target/linux/generic/backport-5.10/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch [new file with mode: 0644]
target/linux/generic/backport-5.10/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch [new file with mode: 0644]
target/linux/generic/backport-5.10/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch [new file with mode: 0644]
target/linux/generic/backport-5.15/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch [new file with mode: 0644]
target/linux/generic/backport-5.15/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch [new file with mode: 0644]
target/linux/generic/backport-5.15/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch [new file with mode: 0644]
target/linux/generic/backport-5.15/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch [new file with mode: 0644]
target/linux/generic/hack-5.10/920-device_tree_cmdline.patch
target/linux/ipq806x/patches-5.10/900-arm-add-cmdline-override.patch
target/linux/mpc85xx/patches-5.10/102-powerpc-add-cmdline-override.patch

diff --git a/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch b/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch
deleted file mode 100644 (file)
index 928e1ca..0000000
+++ /dev/null
@@ -1,1935 +0,0 @@
-From 83216e3988cd196183542937c9bd58b279f946af Mon Sep 17 00:00:00 2001
-From: Michael Walle <michael@walle.cc>
-Date: Mon, 12 Apr 2021 19:47:17 +0200
-Subject: of: net: pass the dst buffer to of_get_mac_address()
-
-of_get_mac_address() returns a "const void*" pointer to a MAC address.
-Lately, support to fetch the MAC address by an NVMEM provider was added.
-But this will only work with platform devices. It will not work with
-PCI devices (e.g. of an integrated root complex) and esp. not with DSA
-ports.
-
-There is an of_* variant of the nvmem binding which works without
-devices. The returned data of a nvmem_cell_read() has to be freed after
-use. On the other hand the return of_get_mac_address() points to some
-static data without a lifetime. The trick for now, was to allocate a
-device resource managed buffer which is then returned. This will only
-work if we have an actual device.
-
-Change it, so that the caller of of_get_mac_address() has to supply a
-buffer where the MAC address is written to. Unfortunately, this will
-touch all drivers which use the of_get_mac_address().
-
-Usually the code looks like:
-
-  const char *addr;
-  addr = of_get_mac_address(np);
-  if (!IS_ERR(addr))
-    ether_addr_copy(ndev->dev_addr, addr);
-
-This can then be simply rewritten as:
-
-  of_get_mac_address(np, ndev->dev_addr);
-
-Sometimes is_valid_ether_addr() is used to test the MAC address.
-of_get_mac_address() already makes sure, it just returns a valid MAC
-address. Thus we can just test its return code. But we have to be
-careful if there are still other sources for the MAC address before the
-of_get_mac_address(). In this case we have to keep the
-is_valid_ether_addr() call.
-
-The following coccinelle patch was used to convert common cases to the
-new style. Afterwards, I've manually gone over the drivers and fixed the
-return code variable: either used a new one or if one was already
-available use that. Mansour Moufid, thanks for that coccinelle patch!
-
-<spml>
-@a@
-identifier x;
-expression y, z;
-@@
-- x = of_get_mac_address(y);
-+ x = of_get_mac_address(y, z);
-  <...
-- ether_addr_copy(z, x);
-  ...>
-
-@@
-identifier a.x;
-@@
-- if (<+... x ...+>) {}
-
-@@
-identifier a.x;
-@@
-  if (<+... x ...+>) {
-      ...
-  }
-- else {}
-
-@@
-identifier a.x;
-expression e;
-@@
-- if (<+... x ...+>@e)
--     {}
-- else
-+ if (!(e))
-      {...}
-
-@@
-expression x, y, z;
-@@
-- x = of_get_mac_address(y, z);
-+ of_get_mac_address(y, z);
-  ... when != x
-</spml>
-
-All drivers, except drivers/net/ethernet/aeroflex/greth.c, were
-compile-time tested.
-
-Suggested-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: Michael Walle <michael@walle.cc>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- arch/arm/mach-mvebu/kirkwood.c                     |  3 +-
- arch/powerpc/sysdev/tsi108_dev.c                   |  5 +-
- drivers/net/ethernet/aeroflex/greth.c              |  6 +--
- drivers/net/ethernet/allwinner/sun4i-emac.c        | 10 ++--
- drivers/net/ethernet/altera/altera_tse_main.c      |  7 +--
- drivers/net/ethernet/arc/emac_main.c               |  8 +--
- drivers/net/ethernet/atheros/ag71xx.c              |  7 +--
- drivers/net/ethernet/broadcom/bcm4908_enet.c       |  7 +--
- drivers/net/ethernet/broadcom/bcmsysport.c         |  7 +--
- drivers/net/ethernet/broadcom/bgmac-bcma.c         | 10 ++--
- drivers/net/ethernet/broadcom/bgmac-platform.c     | 11 ++--
- drivers/net/ethernet/cadence/macb_main.c           | 11 ++--
- drivers/net/ethernet/cavium/octeon/octeon_mgmt.c   |  8 +--
- drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  5 +-
- drivers/net/ethernet/davicom/dm9000.c              | 10 ++--
- drivers/net/ethernet/ethoc.c                       |  6 +--
- drivers/net/ethernet/ezchip/nps_enet.c             |  7 +--
- drivers/net/ethernet/freescale/fec_main.c          |  7 +--
- drivers/net/ethernet/freescale/fec_mpc52xx.c       |  7 +--
- drivers/net/ethernet/freescale/fman/mac.c          |  9 ++--
- .../net/ethernet/freescale/fs_enet/fs_enet-main.c  |  5 +-
- drivers/net/ethernet/freescale/gianfar.c           |  8 +--
- drivers/net/ethernet/freescale/ucc_geth.c          |  5 +-
- drivers/net/ethernet/hisilicon/hisi_femac.c        |  7 +--
- drivers/net/ethernet/hisilicon/hix5hd2_gmac.c      |  7 +--
- drivers/net/ethernet/lantiq_xrx200.c               |  7 +--
- drivers/net/ethernet/marvell/mv643xx_eth.c         |  5 +-
- drivers/net/ethernet/marvell/mvneta.c              |  6 +--
- .../net/ethernet/marvell/prestera/prestera_main.c  | 11 ++--
- drivers/net/ethernet/marvell/pxa168_eth.c          |  9 +---
- drivers/net/ethernet/marvell/sky2.c                |  8 ++-
- drivers/net/ethernet/mediatek/mtk_eth_soc.c        | 11 ++--
- drivers/net/ethernet/micrel/ks8851_common.c        |  7 ++-
- drivers/net/ethernet/microchip/lan743x_main.c      |  5 +-
- drivers/net/ethernet/nxp/lpc_eth.c                 |  4 +-
- drivers/net/ethernet/qualcomm/qca_spi.c            | 10 ++--
- drivers/net/ethernet/qualcomm/qca_uart.c           |  9 +---
- drivers/net/ethernet/renesas/ravb_main.c           | 12 +++--
- drivers/net/ethernet/renesas/sh_eth.c              |  5 +-
- .../net/ethernet/samsung/sxgbe/sxgbe_platform.c    | 13 ++---
- drivers/net/ethernet/socionext/sni_ave.c           | 10 ++--
- .../net/ethernet/stmicro/stmmac/dwmac-anarion.c    |  2 +-
- .../ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c    |  2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-generic.c    |  2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c    |  2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-intel-plat.c |  2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-ipq806x.c    |  2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c    |  2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-mediatek.c   |  2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c  |  2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c    |  2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c  |  2 +-
- .../ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c    |  2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c     |  2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-socfpga.c    |  2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c    |  2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c  |  2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c  |  2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c  |  2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-visconti.c   |  2 +-
- drivers/net/ethernet/stmicro/stmmac/stmmac.h       |  2 +-
- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c  |  2 +-
- .../net/ethernet/stmicro/stmmac/stmmac_platform.c  | 14 ++---
- .../net/ethernet/stmicro/stmmac/stmmac_platform.h  |  2 +-
- drivers/net/ethernet/ti/am65-cpsw-nuss.c           | 19 ++++---
- drivers/net/ethernet/ti/cpsw.c                     |  7 +--
- drivers/net/ethernet/ti/cpsw_new.c                 |  7 +--
- drivers/net/ethernet/ti/davinci_emac.c             |  8 +--
- drivers/net/ethernet/ti/netcp_core.c               |  7 +--
- drivers/net/ethernet/wiznet/w5100-spi.c            |  8 ++-
- drivers/net/ethernet/wiznet/w5100.c                |  2 +-
- drivers/net/ethernet/xilinx/ll_temac_main.c        |  8 +--
- drivers/net/ethernet/xilinx/xilinx_axienet_main.c  | 15 +++---
- drivers/net/ethernet/xilinx/xilinx_emaclite.c      |  8 +--
- drivers/net/wireless/ath/ath9k/init.c              |  5 +-
- drivers/net/wireless/mediatek/mt76/eeprom.c        |  9 +---
- drivers/net/wireless/ralink/rt2x00/rt2x00dev.c     |  6 +--
- drivers/of/of_net.c                                | 60 ++++++++++------------
- drivers/staging/octeon/ethernet.c                  | 10 ++--
- drivers/staging/wfx/main.c                         |  7 ++-
- include/linux/of_net.h                             |  6 +--
- include/net/dsa.h                                  |  2 +-
- net/dsa/dsa2.c                                     |  2 +-
- net/dsa/slave.c                                    |  2 +-
- net/ethernet/eth.c                                 | 11 ++--
- 85 files changed, 218 insertions(+), 364 deletions(-)
-
---- a/arch/arm/mach-mvebu/kirkwood.c
-+++ b/arch/arm/mach-mvebu/kirkwood.c
-@@ -84,6 +84,7 @@ static void __init kirkwood_dt_eth_fixup
-               struct device_node *pnp = of_get_parent(np);
-               struct clk *clk;
-               struct property *pmac;
-+              u8 tmpmac[ETH_ALEN];
-               void __iomem *io;
-               u8 *macaddr;
-               u32 reg;
-@@ -93,7 +94,7 @@ static void __init kirkwood_dt_eth_fixup
-               /* skip disabled nodes or nodes with valid MAC address*/
-               if (!of_device_is_available(pnp) ||
--                  !IS_ERR(of_get_mac_address(np)))
-+                  !of_get_mac_address(np, tmpmac))
-                       goto eth_fixup_skip;
-               clk = of_clk_get(pnp, 0);
---- a/arch/powerpc/sysdev/tsi108_dev.c
-+++ b/arch/powerpc/sysdev/tsi108_dev.c
-@@ -73,7 +73,6 @@ static int __init tsi108_eth_of_init(voi
-               struct device_node *phy, *mdio;
-               hw_info tsi_eth_data;
-               const unsigned int *phy_id;
--              const void *mac_addr;
-               const phandle *ph;
-               memset(r, 0, sizeof(r));
-@@ -101,9 +100,7 @@ static int __init tsi108_eth_of_init(voi
-                       goto err;
-               }
--              mac_addr = of_get_mac_address(np);
--              if (!IS_ERR(mac_addr))
--                      ether_addr_copy(tsi_eth_data.mac_addr, mac_addr);
-+              of_get_mac_address(np, tsi_eth_data.mac_addr);
-               ph = of_get_property(np, "mdio-handle", NULL);
-               mdio = of_find_node_by_phandle(*ph);
---- a/drivers/net/ethernet/aeroflex/greth.c
-+++ b/drivers/net/ethernet/aeroflex/greth.c
-@@ -1450,10 +1450,10 @@ static int greth_of_probe(struct platfor
-                       break;
-       }
-       if (i == 6) {
--              const u8 *addr;
-+              u8 addr[ETH_ALEN];
--              addr = of_get_mac_address(ofdev->dev.of_node);
--              if (!IS_ERR(addr)) {
-+              err = of_get_mac_address(ofdev->dev.of_node, addr);
-+              if (!err) {
-                       for (i = 0; i < 6; i++)
-                               macaddr[i] = (unsigned int) addr[i];
-               } else {
---- a/drivers/net/ethernet/allwinner/sun4i-emac.c
-+++ b/drivers/net/ethernet/allwinner/sun4i-emac.c
-@@ -790,7 +790,6 @@ static int emac_probe(struct platform_de
-       struct emac_board_info *db;
-       struct net_device *ndev;
-       int ret = 0;
--      const char *mac_addr;
-       ndev = alloc_etherdev(sizeof(struct emac_board_info));
-       if (!ndev) {
-@@ -853,12 +852,9 @@ static int emac_probe(struct platform_de
-       }
-       /* Read MAC-address from DT */
--      mac_addr = of_get_mac_address(np);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(ndev->dev_addr, mac_addr);
--
--      /* Check if the MAC address is valid, if not get a random one */
--      if (!is_valid_ether_addr(ndev->dev_addr)) {
-+      ret = of_get_mac_address(np, ndev->dev_addr);
-+      if (ret) {
-+              /* if the MAC address is invalid get a random one */
-               eth_hw_addr_random(ndev);
-               dev_warn(&pdev->dev, "using random MAC address %pM\n",
-                        ndev->dev_addr);
---- a/drivers/net/ethernet/altera/altera_tse_main.c
-+++ b/drivers/net/ethernet/altera/altera_tse_main.c
-@@ -1355,7 +1355,6 @@ static int altera_tse_probe(struct platf
-       struct resource *control_port;
-       struct resource *dma_res;
-       struct altera_tse_private *priv;
--      const unsigned char *macaddr;
-       void __iomem *descmap;
-       const struct of_device_id *of_id = NULL;
-@@ -1532,10 +1531,8 @@ static int altera_tse_probe(struct platf
-       priv->rx_dma_buf_sz = ALTERA_RXDMABUFFER_SIZE;
-       /* get default MAC address from device tree */
--      macaddr = of_get_mac_address(pdev->dev.of_node);
--      if (!IS_ERR(macaddr))
--              ether_addr_copy(ndev->dev_addr, macaddr);
--      else
-+      ret = of_get_mac_address(pdev->dev.of_node, ndev->dev_addr);
-+      if (ret)
-               eth_hw_addr_random(ndev);
-       /* get phy addr and create mdio */
---- a/drivers/net/ethernet/arc/emac_main.c
-+++ b/drivers/net/ethernet/arc/emac_main.c
-@@ -857,7 +857,6 @@ int arc_emac_probe(struct net_device *nd
-       struct device_node *phy_node;
-       struct phy_device *phydev = NULL;
-       struct arc_emac_priv *priv;
--      const char *mac_addr;
-       unsigned int id, clock_frequency, irq;
-       int err;
-@@ -942,11 +941,8 @@ int arc_emac_probe(struct net_device *nd
-       }
-       /* Get MAC address from device tree */
--      mac_addr = of_get_mac_address(dev->of_node);
--
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(ndev->dev_addr, mac_addr);
--      else
-+      err = of_get_mac_address(dev->of_node, ndev->dev_addr);
-+      if (err)
-               eth_hw_addr_random(ndev);
-       arc_emac_set_address_internal(ndev);
---- a/drivers/net/ethernet/atheros/ag71xx.c
-+++ b/drivers/net/ethernet/atheros/ag71xx.c
-@@ -1857,7 +1857,6 @@ static int ag71xx_probe(struct platform_
-       const struct ag71xx_dcfg *dcfg;
-       struct net_device *ndev;
-       struct resource *res;
--      const void *mac_addr;
-       int tx_size, err, i;
-       struct ag71xx *ag;
-@@ -1953,10 +1952,8 @@ static int ag71xx_probe(struct platform_
-       ag->stop_desc->ctrl = 0;
-       ag->stop_desc->next = (u32)ag->stop_desc_dma;
--      mac_addr = of_get_mac_address(np);
--      if (!IS_ERR(mac_addr))
--              memcpy(ndev->dev_addr, mac_addr, ETH_ALEN);
--      if (IS_ERR(mac_addr) || !is_valid_ether_addr(ndev->dev_addr)) {
-+      err = of_get_mac_address(np, ndev->dev_addr);
-+      if (err) {
-               netif_err(ag, probe, ndev, "invalid MAC address, using random address\n");
-               eth_random_addr(ndev->dev_addr);
-       }
---- a/drivers/net/ethernet/broadcom/bcmsysport.c
-+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
-@@ -2468,7 +2468,6 @@ static int bcm_sysport_probe(struct plat
-       struct bcm_sysport_priv *priv;
-       struct device_node *dn;
-       struct net_device *dev;
--      const void *macaddr;
-       u32 txq, rxq;
-       int ret;
-@@ -2563,12 +2562,10 @@ static int bcm_sysport_probe(struct plat
-       }
-       /* Initialize netdevice members */
--      macaddr = of_get_mac_address(dn);
--      if (IS_ERR(macaddr)) {
-+      ret = of_get_mac_address(dn, dev->dev_addr);
-+      if (ret) {
-               dev_warn(&pdev->dev, "using random Ethernet MAC\n");
-               eth_hw_addr_random(dev);
--      } else {
--              ether_addr_copy(dev->dev_addr, macaddr);
-       }
-       SET_NETDEV_DEV(dev, &pdev->dev);
---- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
-+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
-@@ -115,7 +115,7 @@ static int bgmac_probe(struct bcma_devic
-       struct ssb_sprom *sprom = &core->bus->sprom;
-       struct mii_bus *mii_bus;
-       struct bgmac *bgmac;
--      const u8 *mac = NULL;
-+      const u8 *mac;
-       int err;
-       bgmac = bgmac_alloc(&core->dev);
-@@ -128,11 +128,10 @@ static int bgmac_probe(struct bcma_devic
-       bcma_set_drvdata(core, bgmac);
--      if (bgmac->dev->of_node)
--              mac = of_get_mac_address(bgmac->dev->of_node);
-+      err = of_get_mac_address(bgmac->dev->of_node, bgmac->net_dev->dev_addr);
-       /* If no MAC address assigned via device tree, check SPROM */
--      if (IS_ERR_OR_NULL(mac)) {
-+      if (err) {
-               switch (core->core_unit) {
-               case 0:
-                       mac = sprom->et0mac;
-@@ -149,10 +148,9 @@ static int bgmac_probe(struct bcma_devic
-                       err = -ENOTSUPP;
-                       goto err;
-               }
-+              ether_addr_copy(bgmac->net_dev->dev_addr, mac);
-       }
--      ether_addr_copy(bgmac->net_dev->dev_addr, mac);
--
-       /* On BCM4706 we need common core to access PHY */
-       if (core->id.id == BCMA_CORE_4706_MAC_GBIT &&
-           !core->bus->drv_gmac_cmn.core) {
---- a/drivers/net/ethernet/broadcom/bgmac-platform.c
-+++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
-@@ -173,7 +173,7 @@ static int bgmac_probe(struct platform_d
-       struct device_node *np = pdev->dev.of_node;
-       struct bgmac *bgmac;
-       struct resource *regs;
--      const u8 *mac_addr;
-+      int ret;
-       bgmac = bgmac_alloc(&pdev->dev);
-       if (!bgmac)
-@@ -192,11 +192,10 @@ static int bgmac_probe(struct platform_d
-       bgmac->dev = &pdev->dev;
-       bgmac->dma_dev = &pdev->dev;
--      mac_addr = of_get_mac_address(np);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(bgmac->net_dev->dev_addr, mac_addr);
--      else
--              dev_warn(&pdev->dev, "MAC address not present in device tree\n");
-+      ret = of_get_mac_address(np, bgmac->net_dev->dev_addr);
-+      if (ret)
-+              dev_warn(&pdev->dev,
-+                       "MAC address not present in device tree\n");
-       bgmac->irq = platform_get_irq(pdev, 0);
-       if (bgmac->irq < 0)
---- a/drivers/net/ethernet/cadence/macb_main.c
-+++ b/drivers/net/ethernet/cadence/macb_main.c
-@@ -4487,7 +4487,6 @@ static int macb_probe(struct platform_de
-       struct net_device *dev;
-       struct resource *regs;
-       void __iomem *mem;
--      const char *mac;
-       struct macb *bp;
-       int err, val;
-@@ -4600,15 +4599,11 @@ static int macb_probe(struct platform_de
-       if (bp->caps & MACB_CAPS_NEEDS_RSTONUBR)
-               bp->rx_intr_mask |= MACB_BIT(RXUBR);
--      mac = of_get_mac_address(np);
--      if (PTR_ERR(mac) == -EPROBE_DEFER) {
--              err = -EPROBE_DEFER;
-+      err = of_get_mac_address(np, bp->dev->dev_addr);
-+      if (err == -EPROBE_DEFER)
-               goto err_out_free_netdev;
--      } else if (!IS_ERR_OR_NULL(mac)) {
--              ether_addr_copy(bp->dev->dev_addr, mac);
--      } else {
-+      else if (err)
-               macb_get_hwaddr(bp);
--      }
-       err = of_get_phy_mode(np, &interface);
-       if (err)
---- a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
-+++ b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
-@@ -1385,7 +1385,6 @@ static int octeon_mgmt_probe(struct plat
-       struct net_device *netdev;
-       struct octeon_mgmt *p;
-       const __be32 *data;
--      const u8 *mac;
-       struct resource *res_mix;
-       struct resource *res_agl;
-       struct resource *res_agl_prt_ctl;
-@@ -1502,11 +1501,8 @@ static int octeon_mgmt_probe(struct plat
-       netdev->min_mtu = 64 - OCTEON_MGMT_RX_HEADROOM;
-       netdev->max_mtu = 16383 - OCTEON_MGMT_RX_HEADROOM - VLAN_HLEN;
--      mac = of_get_mac_address(pdev->dev.of_node);
--
--      if (!IS_ERR(mac))
--              ether_addr_copy(netdev->dev_addr, mac);
--      else
-+      result = of_get_mac_address(pdev->dev.of_node, netdev->dev_addr);
-+      if (result)
-               eth_hw_addr_random(netdev);
-       p->phy_np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0);
---- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
-+++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
-@@ -1476,7 +1476,6 @@ static int bgx_init_of_phy(struct bgx *b
-       device_for_each_child_node(&bgx->pdev->dev, fwn) {
-               struct phy_device *pd;
-               struct device_node *phy_np;
--              const char *mac;
-               /* Should always be an OF node.  But if it is not, we
-                * cannot handle it, so exit the loop.
-@@ -1485,9 +1484,7 @@ static int bgx_init_of_phy(struct bgx *b
-               if (!node)
-                       break;
--              mac = of_get_mac_address(node);
--              if (!IS_ERR(mac))
--                      ether_addr_copy(bgx->lmac[lmac].mac, mac);
-+              of_get_mac_address(node, bgx->lmac[lmac].mac);
-               SET_NETDEV_DEV(&bgx->lmac[lmac].netdev, &bgx->pdev->dev);
-               bgx->lmac[lmac].lmacid = lmac;
---- a/drivers/net/ethernet/davicom/dm9000.c
-+++ b/drivers/net/ethernet/davicom/dm9000.c
-@@ -1388,7 +1388,7 @@ static struct dm9000_plat_data *dm9000_p
- {
-       struct dm9000_plat_data *pdata;
-       struct device_node *np = dev->of_node;
--      const void *mac_addr;
-+      int ret;
-       if (!IS_ENABLED(CONFIG_OF) || !np)
-               return ERR_PTR(-ENXIO);
-@@ -1402,11 +1402,9 @@ static struct dm9000_plat_data *dm9000_p
-       if (of_find_property(np, "davicom,no-eeprom", NULL))
-               pdata->flags |= DM9000_PLATF_NO_EEPROM;
--      mac_addr = of_get_mac_address(np);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(pdata->dev_addr, mac_addr);
--      else if (PTR_ERR(mac_addr) == -EPROBE_DEFER)
--              return ERR_CAST(mac_addr);
-+      ret = of_get_mac_address(np, pdata->dev_addr);
-+      if (ret == -EPROBE_DEFER)
-+              return ERR_PTR(ret);
-       return pdata;
- }
---- a/drivers/net/ethernet/ethoc.c
-+++ b/drivers/net/ethernet/ethoc.c
-@@ -1151,11 +1151,7 @@ static int ethoc_probe(struct platform_d
-               ether_addr_copy(netdev->dev_addr, pdata->hwaddr);
-               priv->phy_id = pdata->phy_id;
-       } else {
--              const void *mac;
--
--              mac = of_get_mac_address(pdev->dev.of_node);
--              if (!IS_ERR(mac))
--                      ether_addr_copy(netdev->dev_addr, mac);
-+              of_get_mac_address(pdev->dev.of_node, netdev->dev_addr);
-               priv->phy_id = -1;
-       }
---- a/drivers/net/ethernet/ezchip/nps_enet.c
-+++ b/drivers/net/ethernet/ezchip/nps_enet.c
-@@ -575,7 +575,6 @@ static s32 nps_enet_probe(struct platfor
-       struct net_device *ndev;
-       struct nps_enet_priv *priv;
-       s32 err = 0;
--      const char *mac_addr;
-       if (!dev->of_node)
-               return -ENODEV;
-@@ -602,10 +601,8 @@ static s32 nps_enet_probe(struct platfor
-       dev_dbg(dev, "Registers base address is 0x%p\n", priv->regs_base);
-       /* set kernel MAC address to dev */
--      mac_addr = of_get_mac_address(dev->of_node);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(ndev->dev_addr, mac_addr);
--      else
-+      err = of_get_mac_address(dev->of_node, ndev->dev_addr);
-+      if (err)
-               eth_hw_addr_random(ndev);
-       /* Get IRQ number */
---- a/drivers/net/ethernet/freescale/fec_main.c
-+++ b/drivers/net/ethernet/freescale/fec_main.c
-@@ -1666,6 +1666,7 @@ static void fec_get_mac(struct net_devic
-       struct fec_enet_private *fep = netdev_priv(ndev);
-       struct fec_platform_data *pdata = dev_get_platdata(&fep->pdev->dev);
-       unsigned char *iap, tmpaddr[ETH_ALEN];
-+      int ret;
-       /*
-        * try to get mac address in following order:
-@@ -1681,9 +1682,9 @@ static void fec_get_mac(struct net_devic
-       if (!is_valid_ether_addr(iap)) {
-               struct device_node *np = fep->pdev->dev.of_node;
-               if (np) {
--                      const char *mac = of_get_mac_address(np);
--                      if (!IS_ERR(mac))
--                              iap = (unsigned char *) mac;
-+                      ret = of_get_mac_address(np, tmpaddr);
-+                      if (!ret)
-+                              iap = tmpaddr;
-               }
-       }
---- a/drivers/net/ethernet/freescale/fec_mpc52xx.c
-+++ b/drivers/net/ethernet/freescale/fec_mpc52xx.c
-@@ -813,7 +813,6 @@ static int mpc52xx_fec_probe(struct plat
-       const u32 *prop;
-       int prop_size;
-       struct device_node *np = op->dev.of_node;
--      const char *mac_addr;
-       phys_addr_t rx_fifo;
-       phys_addr_t tx_fifo;
-@@ -891,10 +890,8 @@ static int mpc52xx_fec_probe(struct plat
-        *
-        * First try to read MAC address from DT
-        */
--      mac_addr = of_get_mac_address(np);
--      if (!IS_ERR(mac_addr)) {
--              ether_addr_copy(ndev->dev_addr, mac_addr);
--      } else {
-+      rv = of_get_mac_address(np, ndev->dev_addr);
-+      if (rv) {
-               struct mpc52xx_fec __iomem *fec = priv->fec;
-               /*
---- a/drivers/net/ethernet/freescale/fman/mac.c
-+++ b/drivers/net/ethernet/freescale/fman/mac.c
-@@ -616,7 +616,6 @@ static int mac_probe(struct platform_dev
-       struct platform_device  *of_dev;
-       struct resource          res;
-       struct mac_priv_s       *priv;
--      const u8                *mac_addr;
-       u32                      val;
-       u8                      fman_id;
-       phy_interface_t          phy_if;
-@@ -734,11 +733,9 @@ static int mac_probe(struct platform_dev
-       priv->cell_index = (u8)val;
-       /* Get the MAC address */
--      mac_addr = of_get_mac_address(mac_node);
--      if (IS_ERR(mac_addr))
-+      err = of_get_mac_address(mac_node, mac_dev->addr);
-+      if (err)
-               dev_warn(dev, "of_get_mac_address(%pOF) failed\n", mac_node);
--      else
--              ether_addr_copy(mac_dev->addr, mac_addr);
-       /* Get the port handles */
-       nph = of_count_phandle_with_args(mac_node, "fsl,fman-ports", NULL);
-@@ -864,7 +861,7 @@ static int mac_probe(struct platform_dev
-       if (err < 0)
-               dev_err(dev, "fman_set_mac_active_pause() = %d\n", err);
--      if (!IS_ERR(mac_addr))
-+      if (!is_zero_ether_addr(mac_dev->addr))
-               dev_info(dev, "FMan MAC address: %pM\n", mac_dev->addr);
-       priv->eth_dev = dpaa_eth_add_device(fman_id, mac_dev);
---- a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
-+++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
-@@ -918,7 +918,6 @@ static int fs_enet_probe(struct platform
-       const u32 *data;
-       struct clk *clk;
-       int err;
--      const u8 *mac_addr;
-       const char *phy_connection_type;
-       int privsize, len, ret = -ENODEV;
-@@ -1006,9 +1005,7 @@ static int fs_enet_probe(struct platform
-       spin_lock_init(&fep->lock);
-       spin_lock_init(&fep->tx_lock);
--      mac_addr = of_get_mac_address(ofdev->dev.of_node);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(ndev->dev_addr, mac_addr);
-+      of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr);
-       ret = fep->ops->allocate_bd(ndev);
-       if (ret)
---- a/drivers/net/ethernet/freescale/gianfar.c
-+++ b/drivers/net/ethernet/freescale/gianfar.c
-@@ -641,7 +641,6 @@ static phy_interface_t gfar_get_interfac
- static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
- {
-       const char *model;
--      const void *mac_addr;
-       int err = 0, i;
-       phy_interface_t interface;
-       struct net_device *dev = NULL;
-@@ -783,11 +782,8 @@ static int gfar_of_init(struct platform_
-       if (stash_len || stash_idx)
-               priv->device_flags |= FSL_GIANFAR_DEV_HAS_BUF_STASHING;
--      mac_addr = of_get_mac_address(np);
--
--      if (!IS_ERR(mac_addr)) {
--              ether_addr_copy(dev->dev_addr, mac_addr);
--      } else {
-+      err = of_get_mac_address(np, dev->dev_addr);
-+      if (err) {
-               eth_hw_addr_random(dev);
-               dev_info(&ofdev->dev, "Using random MAC address: %pM\n", dev->dev_addr);
-       }
---- a/drivers/net/ethernet/freescale/ucc_geth.c
-+++ b/drivers/net/ethernet/freescale/ucc_geth.c
-@@ -3696,7 +3696,6 @@ static int ucc_geth_probe(struct platfor
-       int err, ucc_num, max_speed = 0;
-       const unsigned int *prop;
-       const char *sprop;
--      const void *mac_addr;
-       phy_interface_t phy_interface;
-       static const int enet_to_speed[] = {
-               SPEED_10, SPEED_10, SPEED_10,
-@@ -3906,9 +3905,7 @@ static int ucc_geth_probe(struct platfor
-               goto err_free_netdev;
-       }
--      mac_addr = of_get_mac_address(np);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(dev->dev_addr, mac_addr);
-+      of_get_mac_address(np, dev->dev_addr);
-       ugeth->ug_info = ug_info;
-       ugeth->dev = device;
---- a/drivers/net/ethernet/hisilicon/hisi_femac.c
-+++ b/drivers/net/ethernet/hisilicon/hisi_femac.c
-@@ -772,7 +772,6 @@ static int hisi_femac_drv_probe(struct p
-       struct net_device *ndev;
-       struct hisi_femac_priv *priv;
-       struct phy_device *phy;
--      const char *mac_addr;
-       int ret;
-       ndev = alloc_etherdev(sizeof(*priv));
-@@ -842,10 +841,8 @@ static int hisi_femac_drv_probe(struct p
-                          (unsigned long)phy->phy_id,
-                          phy_modes(phy->interface));
--      mac_addr = of_get_mac_address(node);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(ndev->dev_addr, mac_addr);
--      if (!is_valid_ether_addr(ndev->dev_addr)) {
-+      ret = of_get_mac_address(node, ndev->dev_addr);
-+      if (ret) {
-               eth_hw_addr_random(ndev);
-               dev_warn(dev, "using random MAC address %pM\n",
-                        ndev->dev_addr);
---- a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c
-+++ b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c
-@@ -1098,7 +1098,6 @@ static int hix5hd2_dev_probe(struct plat
-       struct net_device *ndev;
-       struct hix5hd2_priv *priv;
-       struct mii_bus *bus;
--      const char *mac_addr;
-       int ret;
-       ndev = alloc_etherdev(sizeof(struct hix5hd2_priv));
-@@ -1220,10 +1219,8 @@ static int hix5hd2_dev_probe(struct plat
-               goto out_phy_node;
-       }
--      mac_addr = of_get_mac_address(node);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(ndev->dev_addr, mac_addr);
--      if (!is_valid_ether_addr(ndev->dev_addr)) {
-+      ret = of_get_mac_address(node, ndev->dev_addr);
-+      if (ret) {
-               eth_hw_addr_random(ndev);
-               netdev_warn(ndev, "using random MAC address %pM\n",
-                           ndev->dev_addr);
---- a/drivers/net/ethernet/lantiq_xrx200.c
-+++ b/drivers/net/ethernet/lantiq_xrx200.c
-@@ -440,7 +440,6 @@ static int xrx200_probe(struct platform_
-       struct resource *res;
-       struct xrx200_priv *priv;
-       struct net_device *net_dev;
--      const u8 *mac;
-       int err;
-       /* alloc the network device */
-@@ -484,10 +483,8 @@ static int xrx200_probe(struct platform_
-               return PTR_ERR(priv->clk);
-       }
--      mac = of_get_mac_address(np);
--      if (!IS_ERR(mac))
--              ether_addr_copy(net_dev->dev_addr, mac);
--      else
-+      err = of_get_mac_address(np, net_dev->dev_addr);
-+      if (err)
-               eth_hw_addr_random(net_dev);
-       /* bring up the dma engine and IP core */
---- a/drivers/net/ethernet/marvell/mv643xx_eth.c
-+++ b/drivers/net/ethernet/marvell/mv643xx_eth.c
-@@ -2701,7 +2701,6 @@ static int mv643xx_eth_shared_of_add_por
-       struct platform_device *ppdev;
-       struct mv643xx_eth_platform_data ppd;
-       struct resource res;
--      const char *mac_addr;
-       int ret;
-       int dev_num = 0;
-@@ -2732,9 +2731,7 @@ static int mv643xx_eth_shared_of_add_por
-               return -EINVAL;
-       }
--      mac_addr = of_get_mac_address(pnp);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(ppd.mac_addr, mac_addr);
-+      of_get_mac_address(pnp, ppd.mac_addr);
-       mv643xx_eth_property(pnp, "tx-queue-size", ppd.tx_queue_size);
-       mv643xx_eth_property(pnp, "tx-sram-addr", ppd.tx_sram_addr);
---- a/drivers/net/ethernet/marvell/mvneta.c
-+++ b/drivers/net/ethernet/marvell/mvneta.c
-@@ -5062,7 +5062,6 @@ static int mvneta_probe(struct platform_
-       struct net_device *dev;
-       struct phylink *phylink;
-       struct phy *comphy;
--      const char *dt_mac_addr;
-       char hw_mac_addr[ETH_ALEN];
-       phy_interface_t phy_mode;
-       const char *mac_from;
-@@ -5158,10 +5157,9 @@ static int mvneta_probe(struct platform_
-               goto err_free_ports;
-       }
--      dt_mac_addr = of_get_mac_address(dn);
--      if (!IS_ERR(dt_mac_addr)) {
-+      err = of_get_mac_address(dn, dev->dev_addr);
-+      if (!err) {
-               mac_from = "device tree";
--              ether_addr_copy(dev->dev_addr, dt_mac_addr);
-       } else {
-               mvneta_get_mac_addr(pp, hw_mac_addr);
-               if (is_valid_ether_addr(hw_mac_addr)) {
---- a/drivers/net/ethernet/marvell/prestera/prestera_main.c
-+++ b/drivers/net/ethernet/marvell/prestera/prestera_main.c
-@@ -466,20 +466,17 @@ static int prestera_switch_set_base_mac_
- {
-       struct device_node *base_mac_np;
-       struct device_node *np;
--      const char *base_mac;
-+      int ret;
-       np = of_find_compatible_node(NULL, NULL, "marvell,prestera");
-       base_mac_np = of_parse_phandle(np, "base-mac-provider", 0);
--      base_mac = of_get_mac_address(base_mac_np);
--      of_node_put(base_mac_np);
--      if (!IS_ERR(base_mac))
--              ether_addr_copy(sw->base_mac, base_mac);
--
--      if (!is_valid_ether_addr(sw->base_mac)) {
-+      ret = of_get_mac_address(base_mac_np, sw->base_mac);
-+      if (ret) {
-               eth_random_addr(sw->base_mac);
-               dev_info(prestera_dev(sw), "using random base mac address\n");
-       }
-+      of_node_put(base_mac_np);
-       return prestera_hw_switch_mac_set(sw, sw->base_mac);
- }
---- a/drivers/net/ethernet/marvell/pxa168_eth.c
-+++ b/drivers/net/ethernet/marvell/pxa168_eth.c
-@@ -1392,7 +1392,6 @@ static int pxa168_eth_probe(struct platf
-       struct resource *res;
-       struct clk *clk;
-       struct device_node *np;
--      const unsigned char *mac_addr = NULL;
-       int err;
-       printk(KERN_NOTICE "PXA168 10/100 Ethernet Driver\n");
-@@ -1435,12 +1434,8 @@ static int pxa168_eth_probe(struct platf
-       INIT_WORK(&pep->tx_timeout_task, pxa168_eth_tx_timeout_task);
--      if (pdev->dev.of_node)
--              mac_addr = of_get_mac_address(pdev->dev.of_node);
--
--      if (!IS_ERR_OR_NULL(mac_addr)) {
--              ether_addr_copy(dev->dev_addr, mac_addr);
--      } else {
-+      err = of_get_mac_address(pdev->dev.of_node, dev->dev_addr);
-+      if (err) {
-               /* try reading the mac address, if set by the bootloader */
-               pxa168_eth_get_mac_address(dev, dev->dev_addr);
-               if (!is_valid_ether_addr(dev->dev_addr)) {
---- a/drivers/net/ethernet/marvell/sky2.c
-+++ b/drivers/net/ethernet/marvell/sky2.c
-@@ -4725,7 +4725,7 @@ static struct net_device *sky2_init_netd
- {
-       struct sky2_port *sky2;
-       struct net_device *dev = alloc_etherdev(sizeof(*sky2));
--      const void *iap;
-+      int ret;
-       if (!dev)
-               return NULL;
-@@ -4795,10 +4795,8 @@ static struct net_device *sky2_init_netd
-        * 1) from device tree data
-        * 2) from internal registers set by bootloader
-        */
--      iap = of_get_mac_address(hw->pdev->dev.of_node);
--      if (!IS_ERR(iap))
--              ether_addr_copy(dev->dev_addr, iap);
--      else
-+      ret = of_get_mac_address(hw->pdev->dev.of_node, dev->dev_addr);
-+      if (ret)
-               memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8,
-                             ETH_ALEN);
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2604,14 +2604,11 @@ static int __init mtk_init(struct net_de
- {
-       struct mtk_mac *mac = netdev_priv(dev);
-       struct mtk_eth *eth = mac->hw;
--      const char *mac_addr;
-+      int ret;
--      mac_addr = of_get_mac_address(mac->of_node);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(dev->dev_addr, mac_addr);
--
--      /* If the mac address is invalid, use random mac address  */
--      if (!is_valid_ether_addr(dev->dev_addr)) {
-+      ret = of_get_mac_address(mac->of_node, dev->dev_addr);
-+      if (ret) {
-+              /* If the mac address is invalid, use random mac address */
-               eth_hw_addr_random(dev);
-               dev_err(eth->dev, "generated random MAC address %pM\n",
-                       dev->dev_addr);
---- a/drivers/net/ethernet/micrel/ks8851_common.c
-+++ b/drivers/net/ethernet/micrel/ks8851_common.c
-@@ -194,11 +194,10 @@ static void ks8851_read_mac_addr(struct
- static void ks8851_init_mac(struct ks8851_net *ks, struct device_node *np)
- {
-       struct net_device *dev = ks->netdev;
--      const u8 *mac_addr;
-+      int ret;
--      mac_addr = of_get_mac_address(np);
--      if (!IS_ERR(mac_addr)) {
--              ether_addr_copy(dev->dev_addr, mac_addr);
-+      ret = of_get_mac_address(np, dev->dev_addr);
-+      if (!ret) {
-               ks8851_write_mac_addr(dev);
-               return;
-       }
---- a/drivers/net/ethernet/microchip/lan743x_main.c
-+++ b/drivers/net/ethernet/microchip/lan743x_main.c
-@@ -2831,7 +2831,6 @@ static int lan743x_pcidev_probe(struct p
- {
-       struct lan743x_adapter *adapter = NULL;
-       struct net_device *netdev = NULL;
--      const void *mac_addr;
-       int ret = -ENODEV;
-       netdev = devm_alloc_etherdev(&pdev->dev,
-@@ -2848,9 +2847,7 @@ static int lan743x_pcidev_probe(struct p
-                             NETIF_MSG_IFDOWN | NETIF_MSG_TX_QUEUED;
-       netdev->max_mtu = LAN743X_MAX_FRAME_SIZE;
--      mac_addr = of_get_mac_address(pdev->dev.of_node);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(adapter->mac_address, mac_addr);
-+      of_get_mac_address(pdev->dev.of_node, adapter->mac_address);
-       ret = lan743x_pci_init(adapter, pdev);
-       if (ret)
---- a/drivers/net/ethernet/nxp/lpc_eth.c
-+++ b/drivers/net/ethernet/nxp/lpc_eth.c
-@@ -1347,9 +1347,7 @@ static int lpc_eth_drv_probe(struct plat
-       __lpc_get_mac(pldat, ndev->dev_addr);
-       if (!is_valid_ether_addr(ndev->dev_addr)) {
--              const char *macaddr = of_get_mac_address(np);
--              if (!IS_ERR(macaddr))
--                      ether_addr_copy(ndev->dev_addr, macaddr);
-+              of_get_mac_address(np, ndev->dev_addr);
-       }
-       if (!is_valid_ether_addr(ndev->dev_addr))
-               eth_hw_addr_random(ndev);
---- a/drivers/net/ethernet/qualcomm/qca_spi.c
-+++ b/drivers/net/ethernet/qualcomm/qca_spi.c
-@@ -885,7 +885,7 @@ qca_spi_probe(struct spi_device *spi)
-       struct net_device *qcaspi_devs = NULL;
-       u8 legacy_mode = 0;
-       u16 signature;
--      const char *mac;
-+      int ret;
-       if (!spi->dev.of_node) {
-               dev_err(&spi->dev, "Missing device tree\n");
-@@ -962,12 +962,8 @@ qca_spi_probe(struct spi_device *spi)
-       spi_set_drvdata(spi, qcaspi_devs);
--      mac = of_get_mac_address(spi->dev.of_node);
--
--      if (!IS_ERR(mac))
--              ether_addr_copy(qca->net_dev->dev_addr, mac);
--
--      if (!is_valid_ether_addr(qca->net_dev->dev_addr)) {
-+      ret = of_get_mac_address(spi->dev.of_node, qca->net_dev->dev_addr);
-+      if (ret) {
-               eth_hw_addr_random(qca->net_dev);
-               dev_info(&spi->dev, "Using random MAC address: %pM\n",
-                        qca->net_dev->dev_addr);
---- a/drivers/net/ethernet/qualcomm/qca_uart.c
-+++ b/drivers/net/ethernet/qualcomm/qca_uart.c
-@@ -323,7 +323,6 @@ static int qca_uart_probe(struct serdev_
- {
-       struct net_device *qcauart_dev = alloc_etherdev(sizeof(struct qcauart));
-       struct qcauart *qca;
--      const char *mac;
-       u32 speed = 115200;
-       int ret;
-@@ -348,12 +347,8 @@ static int qca_uart_probe(struct serdev_
-       of_property_read_u32(serdev->dev.of_node, "current-speed", &speed);
--      mac = of_get_mac_address(serdev->dev.of_node);
--
--      if (!IS_ERR(mac))
--              ether_addr_copy(qca->net_dev->dev_addr, mac);
--
--      if (!is_valid_ether_addr(qca->net_dev->dev_addr)) {
-+      ret = of_get_mac_address(serdev->dev.of_node, qca->net_dev->dev_addr);
-+      if (ret) {
-               eth_hw_addr_random(qca->net_dev);
-               dev_info(&serdev->dev, "Using random MAC address: %pM\n",
-                        qca->net_dev->dev_addr);
---- a/drivers/net/ethernet/renesas/ravb_main.c
-+++ b/drivers/net/ethernet/renesas/ravb_main.c
-@@ -109,11 +109,13 @@ static void ravb_set_buffer_align(struct
-  * Ethernet AVB device doesn't have ROM for MAC address.
-  * This function gets the MAC address that was used by a bootloader.
-  */
--static void ravb_read_mac_address(struct net_device *ndev, const u8 *mac)
-+static void ravb_read_mac_address(struct device_node *np,
-+                                struct net_device *ndev)
- {
--      if (!IS_ERR(mac)) {
--              ether_addr_copy(ndev->dev_addr, mac);
--      } else {
-+      int ret;
-+
-+      ret = of_get_mac_address(np, ndev->dev_addr);
-+      if (ret) {
-               u32 mahr = ravb_read(ndev, MAHR);
-               u32 malr = ravb_read(ndev, MALR);
-@@ -2189,7 +2191,7 @@ static int ravb_probe(struct platform_de
-       priv->msg_enable = RAVB_DEF_MSG_ENABLE;
-       /* Read and set MAC address */
--      ravb_read_mac_address(ndev, of_get_mac_address(np));
-+      ravb_read_mac_address(np, ndev);
-       if (!is_valid_ether_addr(ndev->dev_addr)) {
-               dev_warn(&pdev->dev,
-                        "no valid MAC address supplied, using a random one\n");
---- a/drivers/net/ethernet/renesas/sh_eth.c
-+++ b/drivers/net/ethernet/renesas/sh_eth.c
-@@ -3145,7 +3145,6 @@ static struct sh_eth_plat_data *sh_eth_p
-       struct device_node *np = dev->of_node;
-       struct sh_eth_plat_data *pdata;
-       phy_interface_t interface;
--      const char *mac_addr;
-       int ret;
-       pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
-@@ -3157,9 +3156,7 @@ static struct sh_eth_plat_data *sh_eth_p
-               return NULL;
-       pdata->phy_interface = interface;
--      mac_addr = of_get_mac_address(np);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(pdata->mac_addr, mac_addr);
-+      of_get_mac_address(np, pdata->mac_addr);
-       pdata->no_ether_link =
-               of_property_read_bool(np, "renesas,no-ether-link");
---- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
-+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
-@@ -25,8 +25,7 @@
- #ifdef CONFIG_OF
- static int sxgbe_probe_config_dt(struct platform_device *pdev,
--                               struct sxgbe_plat_data *plat,
--                               const char **mac)
-+                               struct sxgbe_plat_data *plat)
- {
-       struct device_node *np = pdev->dev.of_node;
-       struct sxgbe_dma_cfg *dma_cfg;
-@@ -35,7 +34,6 @@ static int sxgbe_probe_config_dt(struct
-       if (!np)
-               return -ENODEV;
--      *mac = of_get_mac_address(np);
-       err = of_get_phy_mode(np, &plat->interface);
-       if (err && err != -ENODEV)
-               return err;
-@@ -63,8 +61,7 @@ static int sxgbe_probe_config_dt(struct
- }
- #else
- static int sxgbe_probe_config_dt(struct platform_device *pdev,
--                               struct sxgbe_plat_data *plat,
--                               const char **mac)
-+                               struct sxgbe_plat_data *plat)
- {
-       return -ENOSYS;
- }
-@@ -85,7 +82,6 @@ static int sxgbe_platform_probe(struct p
-       void __iomem *addr;
-       struct sxgbe_priv_data *priv = NULL;
-       struct sxgbe_plat_data *plat_dat = NULL;
--      const char *mac = NULL;
-       struct net_device *ndev = platform_get_drvdata(pdev);
-       struct device_node *node = dev->of_node;
-@@ -101,7 +97,7 @@ static int sxgbe_platform_probe(struct p
-               if (!plat_dat)
-                       return  -ENOMEM;
--              ret = sxgbe_probe_config_dt(pdev, plat_dat, &mac);
-+              ret = sxgbe_probe_config_dt(pdev, plat_dat);
-               if (ret) {
-                       pr_err("%s: main dt probe failed\n", __func__);
-                       return ret;
-@@ -122,8 +118,7 @@ static int sxgbe_platform_probe(struct p
-       }
-       /* Get MAC address if available (DT) */
--      if (!IS_ERR_OR_NULL(mac))
--              ether_addr_copy(priv->dev->dev_addr, mac);
-+      of_get_mac_address(node, priv->dev->dev_addr);
-       /* Get the TX/RX IRQ numbers */
-       for (i = 0, chan = 1; i < SXGBE_TX_QUEUES; i++) {
---- a/drivers/net/ethernet/socionext/sni_ave.c
-+++ b/drivers/net/ethernet/socionext/sni_ave.c
-@@ -1559,7 +1559,6 @@ static int ave_probe(struct platform_dev
-       struct ave_private *priv;
-       struct net_device *ndev;
-       struct device_node *np;
--      const void *mac_addr;
-       void __iomem *base;
-       const char *name;
-       int i, irq, ret;
-@@ -1600,12 +1599,9 @@ static int ave_probe(struct platform_dev
-       ndev->max_mtu = AVE_MAX_ETHFRAME - (ETH_HLEN + ETH_FCS_LEN);
--      mac_addr = of_get_mac_address(np);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(ndev->dev_addr, mac_addr);
--
--      /* if the mac address is invalid, use random mac address */
--      if (!is_valid_ether_addr(ndev->dev_addr)) {
-+      ret = of_get_mac_address(np, ndev->dev_addr);
-+      if (ret) {
-+              /* if the mac address is invalid, use random mac address */
-               eth_hw_addr_random(ndev);
-               dev_warn(dev, "Using random MAC address: %pM\n",
-                        ndev->dev_addr);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c
-@@ -115,7 +115,7 @@ static int anarion_dwmac_probe(struct pl
-       if (IS_ERR(gmac))
-               return PTR_ERR(gmac);
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
-@@ -445,7 +445,7 @@ static int dwc_eth_dwmac_probe(struct pl
-       if (IS_ERR(stmmac_res.addr))
-               return PTR_ERR(stmmac_res.addr);
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
-@@ -27,7 +27,7 @@ static int dwmac_generic_probe(struct pl
-               return ret;
-       if (pdev->dev.of_node) {
--              plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+              plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-               if (IS_ERR(plat_dat)) {
-                       dev_err(&pdev->dev, "dt configuration failed\n");
-                       return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c
-@@ -226,7 +226,7 @@ static int imx_dwmac_probe(struct platfo
-       if (!dwmac)
-               return -ENOMEM;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-intel-plat.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-intel-plat.c
-@@ -88,7 +88,7 @@ static int intel_eth_plat_probe(struct p
-       if (ret)
-               return ret;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat)) {
-               dev_err(&pdev->dev, "dt configuration failed\n");
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
-@@ -255,7 +255,7 @@ static int ipq806x_gmac_probe(struct pla
-       if (val)
-               return val;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c
-@@ -37,7 +37,7 @@ static int lpc18xx_dwmac_probe(struct pl
-       if (ret)
-               return ret;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c
-@@ -407,7 +407,7 @@ static int mediatek_dwmac_probe(struct p
-       if (ret)
-               return ret;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c
-@@ -52,7 +52,7 @@ static int meson6_dwmac_probe(struct pla
-       if (ret)
-               return ret;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
-@@ -370,7 +370,7 @@ static int meson8b_dwmac_probe(struct pl
-       if (ret)
-               return ret;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c
-@@ -118,7 +118,7 @@ static int oxnas_dwmac_probe(struct plat
-       if (ret)
-               return ret;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
-@@ -461,7 +461,7 @@ static int qcom_ethqos_probe(struct plat
-       if (ret)
-               return ret;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat)) {
-               dev_err(&pdev->dev, "dt configuration failed\n");
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
-@@ -1392,7 +1392,7 @@ static int rk_gmac_probe(struct platform
-       if (ret)
-               return ret;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
-@@ -397,7 +397,7 @@ static int socfpga_dwmac_probe(struct pl
-       if (ret)
-               return ret;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
-@@ -325,7 +325,7 @@ static int sti_dwmac_probe(struct platfo
-       if (ret)
-               return ret;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
-@@ -371,7 +371,7 @@ static int stm32_dwmac_probe(struct plat
-       if (ret)
-               return ret;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
-@@ -1203,7 +1203,7 @@ static int sun8i_dwmac_probe(struct plat
-       if (ret)
-               return -EINVAL;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
-@@ -108,7 +108,7 @@ static int sun7i_gmac_probe(struct platf
-       if (ret)
-               return ret;
--      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
-       if (IS_ERR(plat_dat))
-               return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
-+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
-@@ -25,7 +25,7 @@
- struct stmmac_resources {
-       void __iomem *addr;
--      const char *mac;
-+      u8 mac[ETH_ALEN];
-       int wol_irq;
-       int lpi_irq;
-       int irq;
---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
-@@ -5008,7 +5008,7 @@ int stmmac_dvr_probe(struct device *devi
-       priv->wol_irq = res->wol_irq;
-       priv->lpi_irq = res->lpi_irq;
--      if (!IS_ERR_OR_NULL(res->mac))
-+      if (!is_zero_ether_addr(res->mac))
-               memcpy(priv->dev->dev_addr, res->mac, ETH_ALEN);
-       dev_set_drvdata(device, priv->dev);
---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
-@@ -395,7 +395,7 @@ static int stmmac_of_get_mac_mode(struct
-  * set some private fields that will be used by the main at runtime.
-  */
- struct plat_stmmacenet_data *
--stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
-+stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
- {
-       struct device_node *np = pdev->dev.of_node;
-       struct plat_stmmacenet_data *plat;
-@@ -407,12 +407,12 @@ stmmac_probe_config_dt(struct platform_d
-       if (!plat)
-               return ERR_PTR(-ENOMEM);
--      *mac = of_get_mac_address(np);
--      if (IS_ERR(*mac)) {
--              if (PTR_ERR(*mac) == -EPROBE_DEFER)
--                      return ERR_CAST(*mac);
-+      rc = of_get_mac_address(np, mac);
-+      if (rc) {
-+              if (rc == -EPROBE_DEFER)
-+                      return ERR_PTR(rc);
--              *mac = NULL;
-+              eth_zero_addr(mac);
-       }
-       phy_mode = device_get_phy_mode(&pdev->dev);
-@@ -643,7 +643,7 @@ void stmmac_remove_config_dt(struct plat
- }
- #else
- struct plat_stmmacenet_data *
--stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
-+stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
- {
-       return ERR_PTR(-EINVAL);
- }
---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h
-+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h
-@@ -12,7 +12,7 @@
- #include "stmmac.h"
- struct plat_stmmacenet_data *
--stmmac_probe_config_dt(struct platform_device *pdev, const char **mac);
-+stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac);
- void stmmac_remove_config_dt(struct platform_device *pdev,
-                            struct plat_stmmacenet_data *plat);
---- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c
-+++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
-@@ -1742,7 +1742,6 @@ static int am65_cpsw_nuss_init_slave_por
-       for_each_child_of_node(node, port_np) {
-               struct am65_cpsw_port *port;
--              const void *mac_addr;
-               u32 port_id;
-               /* it is not a slave port node, continue */
-@@ -1821,15 +1820,15 @@ static int am65_cpsw_nuss_init_slave_por
-                       return ret;
-               }
--              mac_addr = of_get_mac_address(port_np);
--              if (!IS_ERR(mac_addr)) {
--                      ether_addr_copy(port->slave.mac_addr, mac_addr);
--              } else if (am65_cpsw_am654_get_efuse_macid(port_np,
--                                                         port->port_id,
--                                                         port->slave.mac_addr) ||
--                         !is_valid_ether_addr(port->slave.mac_addr)) {
--                      random_ether_addr(port->slave.mac_addr);
--                      dev_err(dev, "Use random MAC address\n");
-+              ret = of_get_mac_address(port_np, port->slave.mac_addr);
-+              if (ret) {
-+                      am65_cpsw_am654_get_efuse_macid(port_np,
-+                                                      port->port_id,
-+                                                      port->slave.mac_addr);
-+                      if (!is_valid_ether_addr(port->slave.mac_addr)) {
-+                              random_ether_addr(port->slave.mac_addr);
-+                              dev_err(dev, "Use random MAC address\n");
-+                      }
-               }
-       }
-       of_node_put(node);
---- a/drivers/net/ethernet/ti/cpsw.c
-+++ b/drivers/net/ethernet/ti/cpsw.c
-@@ -1308,7 +1308,6 @@ static int cpsw_probe_dt(struct cpsw_pla
-       for_each_available_child_of_node(node, slave_node) {
-               struct cpsw_slave_data *slave_data = data->slave_data + i;
--              const void *mac_addr = NULL;
-               int lenp;
-               const __be32 *parp;
-@@ -1380,10 +1379,8 @@ static int cpsw_probe_dt(struct cpsw_pla
-               }
- no_phy_slave:
--              mac_addr = of_get_mac_address(slave_node);
--              if (!IS_ERR(mac_addr)) {
--                      ether_addr_copy(slave_data->mac_addr, mac_addr);
--              } else {
-+              ret = of_get_mac_address(slave_node, slave_data->mac_addr);
-+              if (ret) {
-                       ret = ti_cm_get_macid(&pdev->dev, i,
-                                             slave_data->mac_addr);
-                       if (ret)
---- a/drivers/net/ethernet/ti/cpsw_new.c
-+++ b/drivers/net/ethernet/ti/cpsw_new.c
-@@ -1269,7 +1269,6 @@ static int cpsw_probe_dt(struct cpsw_com
-       for_each_child_of_node(tmp_node, port_np) {
-               struct cpsw_slave_data *slave_data;
--              const void *mac_addr;
-               u32 port_id;
-               ret = of_property_read_u32(port_np, "reg", &port_id);
-@@ -1328,10 +1327,8 @@ static int cpsw_probe_dt(struct cpsw_com
-                       goto err_node_put;
-               }
--              mac_addr = of_get_mac_address(port_np);
--              if (!IS_ERR(mac_addr)) {
--                      ether_addr_copy(slave_data->mac_addr, mac_addr);
--              } else {
-+              ret = of_get_mac_address(port_np, slave_data->mac_addr);
-+              if (ret) {
-                       ret = ti_cm_get_macid(dev, port_id - 1,
-                                             slave_data->mac_addr);
-                       if (ret)
---- a/drivers/net/ethernet/ti/davinci_emac.c
-+++ b/drivers/net/ethernet/ti/davinci_emac.c
-@@ -1699,7 +1699,6 @@ davinci_emac_of_get_pdata(struct platfor
-       const struct of_device_id *match;
-       const struct emac_platform_data *auxdata;
-       struct emac_platform_data *pdata = NULL;
--      const u8 *mac_addr;
-       if (!IS_ENABLED(CONFIG_OF) || !pdev->dev.of_node)
-               return dev_get_platdata(&pdev->dev);
-@@ -1711,11 +1710,8 @@ davinci_emac_of_get_pdata(struct platfor
-       np = pdev->dev.of_node;
-       pdata->version = EMAC_VERSION_2;
--      if (!is_valid_ether_addr(pdata->mac_addr)) {
--              mac_addr = of_get_mac_address(np);
--              if (!IS_ERR(mac_addr))
--                      ether_addr_copy(pdata->mac_addr, mac_addr);
--      }
-+      if (!is_valid_ether_addr(pdata->mac_addr))
-+              of_get_mac_address(np, pdata->mac_addr);
-       of_property_read_u32(np, "ti,davinci-ctrl-reg-offset",
-                            &pdata->ctrl_reg_offset);
---- a/drivers/net/ethernet/ti/netcp_core.c
-+++ b/drivers/net/ethernet/ti/netcp_core.c
-@@ -1966,7 +1966,6 @@ static int netcp_create_interface(struct
-       struct resource res;
-       void __iomem *efuse = NULL;
-       u32 efuse_mac = 0;
--      const void *mac_addr;
-       u8 efuse_mac_addr[6];
-       u32 temp[2];
-       int ret = 0;
-@@ -2036,10 +2035,8 @@ static int netcp_create_interface(struct
-               devm_iounmap(dev, efuse);
-               devm_release_mem_region(dev, res.start, size);
-       } else {
--              mac_addr = of_get_mac_address(node_interface);
--              if (!IS_ERR(mac_addr))
--                      ether_addr_copy(ndev->dev_addr, mac_addr);
--              else
-+              ret = of_get_mac_address(node_interface, ndev->dev_addr);
-+              if (ret)
-                       eth_random_addr(ndev->dev_addr);
-       }
---- a/drivers/net/ethernet/wiznet/w5100-spi.c
-+++ b/drivers/net/ethernet/wiznet/w5100-spi.c
-@@ -423,8 +423,14 @@ static int w5100_spi_probe(struct spi_de
-       const struct of_device_id *of_id;
-       const struct w5100_ops *ops;
-       kernel_ulong_t driver_data;
-+      const void *mac = NULL;
-+      u8 tmpmac[ETH_ALEN];
-       int priv_size;
--      const void *mac = of_get_mac_address(spi->dev.of_node);
-+      int ret;
-+
-+      ret = of_get_mac_address(spi->dev.of_node, tmpmac);
-+      if (!ret)
-+              mac = tmpmac;
-       if (spi->dev.of_node) {
-               of_id = of_match_device(w5100_of_match, &spi->dev);
---- a/drivers/net/ethernet/wiznet/w5100.c
-+++ b/drivers/net/ethernet/wiznet/w5100.c
-@@ -1159,7 +1159,7 @@ int w5100_probe(struct device *dev, cons
-       INIT_WORK(&priv->setrx_work, w5100_setrx_work);
-       INIT_WORK(&priv->restart_work, w5100_restart_work);
--      if (!IS_ERR_OR_NULL(mac_addr))
-+      if (mac_addr)
-               memcpy(ndev->dev_addr, mac_addr, ETH_ALEN);
-       else
-               eth_hw_addr_random(ndev);
---- a/drivers/net/ethernet/xilinx/ll_temac_main.c
-+++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
-@@ -438,7 +438,7 @@ static void temac_do_set_mac_address(str
- static int temac_init_mac_address(struct net_device *ndev, const void *address)
- {
--      ether_addr_copy(ndev->dev_addr, address);
-+      memcpy(ndev->dev_addr, address, ETH_ALEN);
-       if (!is_valid_ether_addr(ndev->dev_addr))
-               eth_hw_addr_random(ndev);
-       temac_do_set_mac_address(ndev);
-@@ -1370,7 +1370,7 @@ static int temac_probe(struct platform_d
-       struct device_node *temac_np = dev_of_node(&pdev->dev), *dma_np;
-       struct temac_local *lp;
-       struct net_device *ndev;
--      const void *addr;
-+      u8 addr[ETH_ALEN];
-       __be32 *p;
-       bool little_endian;
-       int rc = 0;
-@@ -1563,8 +1563,8 @@ static int temac_probe(struct platform_d
-       if (temac_np) {
-               /* Retrieve the MAC address */
--              addr = of_get_mac_address(temac_np);
--              if (IS_ERR(addr)) {
-+              rc = of_get_mac_address(temac_np, addr);
-+              if (rc) {
-                       dev_err(&pdev->dev, "could not find MAC address\n");
-                       return -ENODEV;
-               }
---- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
-+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
-@@ -1843,8 +1843,8 @@ static int axienet_probe(struct platform
-       struct device_node *np;
-       struct axienet_local *lp;
-       struct net_device *ndev;
--      const void *mac_addr;
-       struct resource *ethres;
-+      u8 mac_addr[ETH_ALEN];
-       int addr_width = 32;
-       u32 value;
-@@ -2044,13 +2044,14 @@ static int axienet_probe(struct platform
-               dev_info(&pdev->dev, "Ethernet core IRQ not defined\n");
-       /* Retrieve the MAC address */
--      mac_addr = of_get_mac_address(pdev->dev.of_node);
--      if (IS_ERR(mac_addr)) {
--              dev_warn(&pdev->dev, "could not find MAC address property: %ld\n",
--                       PTR_ERR(mac_addr));
--              mac_addr = NULL;
-+      ret = of_get_mac_address(pdev->dev.of_node, mac_addr);
-+      if (!ret) {
-+              axienet_set_mac_address(ndev, mac_addr);
-+      } else {
-+              dev_warn(&pdev->dev, "could not find MAC address property: %d\n",
-+                       ret);
-+              axienet_set_mac_address(ndev, NULL);
-       }
--      axienet_set_mac_address(ndev, mac_addr);
-       lp->coalesce_count_rx = XAXIDMA_DFT_RX_THRESHOLD;
-       lp->coalesce_count_tx = XAXIDMA_DFT_TX_THRESHOLD;
---- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c
-+++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
-@@ -1107,7 +1107,6 @@ static int xemaclite_of_probe(struct pla
-       struct net_device *ndev = NULL;
-       struct net_local *lp = NULL;
-       struct device *dev = &ofdev->dev;
--      const void *mac_address;
-       int rc = 0;
-@@ -1149,12 +1148,9 @@ static int xemaclite_of_probe(struct pla
-       lp->next_rx_buf_to_use = 0x0;
-       lp->tx_ping_pong = get_bool(ofdev, "xlnx,tx-ping-pong");
-       lp->rx_ping_pong = get_bool(ofdev, "xlnx,rx-ping-pong");
--      mac_address = of_get_mac_address(ofdev->dev.of_node);
--      if (!IS_ERR(mac_address)) {
--              /* Set the MAC address. */
--              ether_addr_copy(ndev->dev_addr, mac_address);
--      } else {
-+      rc = of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr);
-+      if (rc) {
-               dev_warn(dev, "No MAC address found, using random\n");
-               eth_hw_addr_random(ndev);
-       }
---- a/drivers/net/wireless/ath/ath9k/init.c
-+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -618,7 +618,6 @@ static int ath9k_of_init(struct ath_soft
-       struct ath_hw *ah = sc->sc_ah;
-       struct ath_common *common = ath9k_hw_common(ah);
-       enum ath_bus_type bus_type = common->bus_ops->ath_bus_type;
--      const char *mac;
-       char eeprom_name[100];
-       int ret;
-@@ -641,9 +640,7 @@ static int ath9k_of_init(struct ath_soft
-               ah->ah_flags |= AH_NO_EEP_SWAP;
-       }
--      mac = of_get_mac_address(np);
--      if (!IS_ERR(mac))
--              ether_addr_copy(common->macaddr, mac);
-+      of_get_mac_address(np, common->macaddr);
-       return 0;
- }
---- a/drivers/net/wireless/mediatek/mt76/eeprom.c
-+++ b/drivers/net/wireless/mediatek/mt76/eeprom.c
-@@ -90,15 +90,9 @@ out_put_node:
- void
- mt76_eeprom_override(struct mt76_dev *dev)
- {
--#ifdef CONFIG_OF
-       struct device_node *np = dev->dev->of_node;
--      const u8 *mac = NULL;
--      if (np)
--              mac = of_get_mac_address(np);
--      if (!IS_ERR_OR_NULL(mac))
--              ether_addr_copy(dev->macaddr, mac);
--#endif
-+      of_get_mac_address(np, dev->macaddr);
-       if (!is_valid_ether_addr(dev->macaddr)) {
-               eth_random_addr(dev->macaddr);
---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
-@@ -990,11 +990,7 @@ static void rt2x00lib_rate(struct ieee80
- void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr)
- {
--      const char *mac_addr;
--
--      mac_addr = of_get_mac_address(rt2x00dev->dev->of_node);
--      if (!IS_ERR(mac_addr))
--              ether_addr_copy(eeprom_mac_addr, mac_addr);
-+      of_get_mac_address(rt2x00dev->dev->of_node, eeprom_mac_addr);
-       if (!is_valid_ether_addr(eeprom_mac_addr)) {
-               eth_random_addr(eeprom_mac_addr);
---- a/drivers/of/of_net.c
-+++ b/drivers/of/of_net.c
-@@ -45,37 +45,29 @@ int of_get_phy_mode(struct device_node *
- }
- EXPORT_SYMBOL_GPL(of_get_phy_mode);
--static const void *of_get_mac_addr(struct device_node *np, const char *name)
-+static int of_get_mac_addr(struct device_node *np, const char *name, u8 *addr)
- {
-       struct property *pp = of_find_property(np, name, NULL);
--      if (pp && pp->length == ETH_ALEN && is_valid_ether_addr(pp->value))
--              return pp->value;
--      return NULL;
-+      if (pp && pp->length == ETH_ALEN && is_valid_ether_addr(pp->value)) {
-+              memcpy(addr, pp->value, ETH_ALEN);
-+              return 0;
-+      }
-+      return -ENODEV;
- }
--static const void *of_get_mac_addr_nvmem(struct device_node *np)
-+static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr)
- {
--      int ret;
--      const void *mac;
--      u8 nvmem_mac[ETH_ALEN];
-       struct platform_device *pdev = of_find_device_by_node(np);
-+      int ret;
-       if (!pdev)
--              return ERR_PTR(-ENODEV);
-+              return -ENODEV;
--      ret = nvmem_get_mac_address(&pdev->dev, &nvmem_mac);
--      if (ret) {
--              put_device(&pdev->dev);
--              return ERR_PTR(ret);
--      }
--
--      mac = devm_kmemdup(&pdev->dev, nvmem_mac, ETH_ALEN, GFP_KERNEL);
-+      ret = nvmem_get_mac_address(&pdev->dev, addr);
-       put_device(&pdev->dev);
--      if (!mac)
--              return ERR_PTR(-ENOMEM);
--      return mac;
-+      return ret;
- }
- /**
-@@ -98,24 +90,27 @@ static const void *of_get_mac_addr_nvmem
-  * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists
-  * but is all zeros.
-  *
-- * Return: Will be a valid pointer on success and ERR_PTR in case of error.
-+ * Return: 0 on success and errno in case of error.
- */
--const void *of_get_mac_address(struct device_node *np)
-+int of_get_mac_address(struct device_node *np, u8 *addr)
- {
--      const void *addr;
--
--      addr = of_get_mac_addr(np, "mac-address");
--      if (addr)
--              return addr;
-+      int ret;
--      addr = of_get_mac_addr(np, "local-mac-address");
--      if (addr)
--              return addr;
-+      if (!np)
-+              return -ENODEV;
--      addr = of_get_mac_addr(np, "address");
--      if (addr)
--              return addr;
-+      ret = of_get_mac_addr(np, "mac-address", addr);
-+      if (!ret)
-+              return 0;
-+
-+      ret = of_get_mac_addr(np, "local-mac-address", addr);
-+      if (!ret)
-+              return 0;
-+
-+      ret = of_get_mac_addr(np, "address", addr);
-+      if (!ret)
-+              return 0;
--      return of_get_mac_addr_nvmem(np);
-+      return of_get_mac_addr_nvmem(np, addr);
- }
- EXPORT_SYMBOL(of_get_mac_address);
---- a/drivers/staging/octeon/ethernet.c
-+++ b/drivers/staging/octeon/ethernet.c
-@@ -407,14 +407,10 @@ static int cvm_oct_common_set_mac_addres
- int cvm_oct_common_init(struct net_device *dev)
- {
-       struct octeon_ethernet *priv = netdev_priv(dev);
--      const u8 *mac = NULL;
-+      int ret;
--      if (priv->of_node)
--              mac = of_get_mac_address(priv->of_node);
--
--      if (!IS_ERR_OR_NULL(mac))
--              ether_addr_copy(dev->dev_addr, mac);
--      else
-+      ret = of_get_mac_address(priv->of_node, dev->dev_addr);
-+      if (ret)
-               eth_hw_addr_random(dev);
-       /*
---- a/drivers/staging/wfx/main.c
-+++ b/drivers/staging/wfx/main.c
-@@ -339,7 +339,6 @@ int wfx_probe(struct wfx_dev *wdev)
- {
-       int i;
-       int err;
--      const void *macaddr;
-       struct gpio_desc *gpio_saved;
-       // During first part of boot, gpio_wakeup cannot yet been used. So
-@@ -428,9 +427,9 @@ int wfx_probe(struct wfx_dev *wdev)
-       for (i = 0; i < ARRAY_SIZE(wdev->addresses); i++) {
-               eth_zero_addr(wdev->addresses[i].addr);
--              macaddr = of_get_mac_address(wdev->dev->of_node);
--              if (!IS_ERR_OR_NULL(macaddr)) {
--                      ether_addr_copy(wdev->addresses[i].addr, macaddr);
-+              err = of_get_mac_address(wdev->dev->of_node,
-+                                       wdev->addresses[i].addr);
-+              if (!err) {
-                       wdev->addresses[i].addr[ETH_ALEN - 1] += i;
-               } else {
-                       ether_addr_copy(wdev->addresses[i].addr,
---- a/include/linux/of_net.h
-+++ b/include/linux/of_net.h
-@@ -13,7 +13,7 @@
- struct net_device;
- extern int of_get_phy_mode(struct device_node *np, phy_interface_t *interface);
--extern const void *of_get_mac_address(struct device_node *np);
-+extern int of_get_mac_address(struct device_node *np, u8 *mac);
- extern struct net_device *of_find_net_device_by_node(struct device_node *np);
- #else
- static inline int of_get_phy_mode(struct device_node *np,
-@@ -22,9 +22,9 @@ static inline int of_get_phy_mode(struct
-       return -ENODEV;
- }
--static inline const void *of_get_mac_address(struct device_node *np)
-+static inline int of_get_mac_address(struct device_node *np, u8 *mac)
- {
--      return ERR_PTR(-ENODEV);
-+      return -ENODEV;
- }
- static inline struct net_device *of_find_net_device_by_node(struct device_node *np)
---- a/include/net/dsa.h
-+++ b/include/net/dsa.h
-@@ -208,7 +208,7 @@ struct dsa_port {
-       unsigned int            index;
-       const char              *name;
-       struct dsa_port         *cpu_dp;
--      const char              *mac;
-+      u8                      mac[ETH_ALEN];
-       struct device_node      *dn;
-       unsigned int            ageing_time;
-       bool                    vlan_filtering;
---- a/net/dsa/dsa2.c
-+++ b/net/dsa/dsa2.c
-@@ -288,7 +288,7 @@ static int dsa_port_setup(struct dsa_por
-               break;
-       case DSA_PORT_TYPE_USER:
--              dp->mac = of_get_mac_address(dp->dn);
-+              of_get_mac_address(dp->dn, dp->mac);
-               err = dsa_slave_create(dp);
-               if (err)
-                       break;
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -1855,7 +1855,7 @@ int dsa_slave_create(struct dsa_port *po
-       slave_dev->hw_features |= NETIF_F_HW_TC;
-       slave_dev->features |= NETIF_F_LLTX;
-       slave_dev->ethtool_ops = &dsa_slave_ethtool_ops;
--      if (!IS_ERR_OR_NULL(port->mac))
-+      if (!is_zero_ether_addr(port->mac))
-               ether_addr_copy(slave_dev->dev_addr, port->mac);
-       else
-               eth_hw_addr_inherit(slave_dev, master);
---- a/net/ethernet/eth.c
-+++ b/net/ethernet/eth.c
-@@ -506,13 +506,14 @@ unsigned char * __weak arch_get_platform
- int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr)
- {
--      const unsigned char *addr = NULL;
-+      unsigned char *addr;
-+      int ret;
--      if (dev->of_node)
--              addr = of_get_mac_address(dev->of_node);
--      if (IS_ERR_OR_NULL(addr))
--              addr = arch_get_platform_mac_address();
-+      ret = of_get_mac_address(dev->of_node, mac_addr);
-+      if (!ret)
-+              return 0;
-+      addr = arch_get_platform_mac_address();
-       if (!addr)
-               return -ENODEV;
diff --git a/target/linux/generic/backport-5.10/732-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch b/target/linux/generic/backport-5.10/732-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch
deleted file mode 100644 (file)
index 245c5f3..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-From f10843e04a075202dbb39dfcee047e3a2fdf5a8d Mon Sep 17 00:00:00 2001
-From: Michael Walle <michael@walle.cc>
-Date: Mon, 12 Apr 2021 19:47:18 +0200
-Subject: of: net: fix of_get_mac_addr_nvmem() for non-platform devices
-
-of_get_mac_address() already supports fetching the MAC address by an
-nvmem provider. But until now, it was just working for platform devices.
-Esp. it was not working for DSA ports and PCI devices. It gets more
-common that PCI devices have a device tree binding since SoCs contain
-integrated root complexes.
-
-Use the nvmem of_* binding to fetch the nvmem cells by a struct
-device_node. We still have to try to read the cell by device first
-because there might be a nvmem_cell_lookup associated with that device.
-
-Signed-off-by: Michael Walle <michael@walle.cc>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/of/of_net.c | 35 ++++++++++++++++++++++++++++++-----
- 1 file changed, 30 insertions(+), 5 deletions(-)
-
---- a/drivers/of/of_net.c
-+++ b/drivers/of/of_net.c
-@@ -11,6 +11,7 @@
- #include <linux/phy.h>
- #include <linux/export.h>
- #include <linux/device.h>
-+#include <linux/nvmem-consumer.h>
- /**
-  * of_get_phy_mode - Get phy mode for given device_node
-@@ -59,15 +60,39 @@ static int of_get_mac_addr(struct device
- static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr)
- {
-       struct platform_device *pdev = of_find_device_by_node(np);
-+      struct nvmem_cell *cell;
-+      const void *mac;
-+      size_t len;
-       int ret;
--      if (!pdev)
--              return -ENODEV;
-+      /* Try lookup by device first, there might be a nvmem_cell_lookup
-+       * associated with a given device.
-+       */
-+      if (pdev) {
-+              ret = nvmem_get_mac_address(&pdev->dev, addr);
-+              put_device(&pdev->dev);
-+              return ret;
-+      }
-+
-+      cell = of_nvmem_cell_get(np, "mac-address");
-+      if (IS_ERR(cell))
-+              return PTR_ERR(cell);
-+
-+      mac = nvmem_cell_read(cell, &len);
-+      nvmem_cell_put(cell);
-+
-+      if (IS_ERR(mac))
-+              return PTR_ERR(mac);
-+
-+      if (len != ETH_ALEN || !is_valid_ether_addr(mac)) {
-+              kfree(mac);
-+              return -EINVAL;
-+      }
--      ret = nvmem_get_mac_address(&pdev->dev, addr);
--      put_device(&pdev->dev);
-+      memcpy(addr, mac, ETH_ALEN);
-+      kfree(mac);
--      return ret;
-+      return 0;
- }
- /**
diff --git a/target/linux/generic/backport-5.10/732-v5.13-0003-of-base-Fix-some-formatting-issues-and-provide-missi.patch b/target/linux/generic/backport-5.10/732-v5.13-0003-of-base-Fix-some-formatting-issues-and-provide-missi.patch
new file mode 100644 (file)
index 0000000..33808f8
--- /dev/null
@@ -0,0 +1,95 @@
+From 3637d49e11219512920aca8b8ccd0994be33fa8b Mon Sep 17 00:00:00 2001
+From: Lee Jones <lee.jones@linaro.org>
+Date: Thu, 18 Mar 2021 10:40:30 +0000
+Subject: [PATCH] of: base: Fix some formatting issues and provide missing
+ descriptions
+
+Fixes the following W=1 kernel build warning(s):
+
+ drivers/of/base.c:315: warning: Function parameter or member 'cpun' not described in '__of_find_n_match_cpu_property'
+ drivers/of/base.c:315: warning: Function parameter or member 'prop_name' not described in '__of_find_n_match_cpu_property'
+ drivers/of/base.c:315: warning: Function parameter or member 'cpu' not described in '__of_find_n_match_cpu_property'
+ drivers/of/base.c:315: warning: Function parameter or member 'thread' not described in '__of_find_n_match_cpu_property'
+ drivers/of/base.c:315: warning: expecting prototype for property holds the physical id of the(). Prototype was for __of_find_n_match_cpu_property() instead
+ drivers/of/base.c:1139: warning: Function parameter or member 'match' not described in 'of_find_matching_node_and_match'
+ drivers/of/base.c:1779: warning: Function parameter or member 'np' not described in '__of_add_property'
+ drivers/of/base.c:1779: warning: Function parameter or member 'prop' not described in '__of_add_property'
+ drivers/of/base.c:1800: warning: Function parameter or member 'np' not described in 'of_add_property'
+ drivers/of/base.c:1800: warning: Function parameter or member 'prop' not described in 'of_add_property'
+ drivers/of/base.c:1849: warning: Function parameter or member 'np' not described in 'of_remove_property'
+ drivers/of/base.c:1849: warning: Function parameter or member 'prop' not described in 'of_remove_property'
+ drivers/of/base.c:2137: warning: Function parameter or member 'dn' not described in 'of_console_check'
+ drivers/of/base.c:2137: warning: Function parameter or member 'name' not described in 'of_console_check'
+ drivers/of/base.c:2137: warning: Function parameter or member 'index' not described in 'of_console_check'
+
+Cc: Rob Herring <robh+dt@kernel.org>
+Cc: Frank Rowand <frowand.list@gmail.com>
+Cc: "David S. Miller" <davem@davemloft.net>
+Cc: devicetree@vger.kernel.org
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Signed-off-by: Rob Herring <robh@kernel.org>
+Link: https://lore.kernel.org/r/20210318104036.3175910-5-lee.jones@linaro.org
+---
+ drivers/of/base.c | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+--- a/drivers/of/base.c
++++ b/drivers/of/base.c
+@@ -305,7 +305,7 @@ bool __weak arch_match_cpu_phys_id(int c
+       return (u32)phys_id == cpu;
+ }
+-/**
++/*
+  * Checks if the given "prop_name" property holds the physical id of the
+  * core/thread corresponding to the logical cpu 'cpu'. If 'thread' is not
+  * NULL, local thread number within the core is returned in it.
+@@ -1128,7 +1128,7 @@ EXPORT_SYMBOL(of_match_node);
+  *                    will; typically, you pass what the previous call
+  *                    returned. of_node_put() will be called on it
+  *    @matches:       array of of device match structures to search in
+- *    @match          Updated to point at the matches entry which matched
++ *    @match:         Updated to point at the matches entry which matched
+  *
+  *    Returns a node pointer with refcount incremented, use
+  *    of_node_put() on it when done.
+@@ -1779,6 +1779,8 @@ EXPORT_SYMBOL(of_count_phandle_with_args
+ /**
+  * __of_add_property - Add a property to a node without lock operations
++ * @np:               Caller's Device Node
++ * @prob:     Property to add
+  */
+ int __of_add_property(struct device_node *np, struct property *prop)
+ {
+@@ -1800,6 +1802,8 @@ int __of_add_property(struct device_node
+ /**
+  * of_add_property - Add a property to a node
++ * @np:               Caller's Device Node
++ * @prob:     Property to add
+  */
+ int of_add_property(struct device_node *np, struct property *prop)
+ {
+@@ -1844,6 +1848,8 @@ int __of_remove_property(struct device_n
+ /**
+  * of_remove_property - Remove a property from a node.
++ * @np:               Caller's Device Node
++ * @prob:     Property to remove
+  *
+  * Note that we don't actually remove it, since we have given out
+  * who-knows-how-many pointers to the data using get-property.
+@@ -2130,9 +2136,9 @@ EXPORT_SYMBOL_GPL(of_alias_get_highest_i
+ /**
+  * of_console_check() - Test and setup console for DT setup
+- * @dn - Pointer to device node
+- * @name - Name to use for preferred console without index. ex. "ttyS"
+- * @index - Index to use for preferred console.
++ * @dn: Pointer to device node
++ * @name: Name to use for preferred console without index. ex. "ttyS"
++ * @index: Index to use for preferred console.
+  *
+  * Check if the given device node matches the stdout-path property in the
+  * /chosen node. If it does then register it as the preferred console and return
diff --git a/target/linux/generic/backport-5.10/732-v5.13-0005-of-Fix-kerneldoc-output-formatting.patch b/target/linux/generic/backport-5.10/732-v5.13-0005-of-Fix-kerneldoc-output-formatting.patch
new file mode 100644 (file)
index 0000000..bda03b9
--- /dev/null
@@ -0,0 +1,489 @@
+From 62f026f082e4d762a47b43ea693b38f025122332 Mon Sep 17 00:00:00 2001
+From: Rob Herring <robh@kernel.org>
+Date: Fri, 26 Mar 2021 13:26:06 -0600
+Subject: [PATCH] of: Fix kerneldoc output formatting
+
+The indentation of the kerneldoc comments affects the output formatting.
+Leading tabs in particular don't work, sections need to be indented
+under the section header, and several code blocks are reformatted.
+
+Cc: Frank Rowand <frowand.list@gmail.com>
+Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
+Signed-off-by: Rob Herring <robh@kernel.org>
+Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
+Link: https://lore.kernel.org/r/20210326192606.3702739-1-robh@kernel.org
+---
+ drivers/of/base.c | 275 +++++++++++++++++++++++-----------------------
+ drivers/of/fdt.c  |   9 +-
+ 2 files changed, 141 insertions(+), 143 deletions(-)
+
+--- a/drivers/of/base.c
++++ b/drivers/of/base.c
+@@ -651,11 +651,11 @@ bool of_device_is_big_endian(const struc
+ EXPORT_SYMBOL(of_device_is_big_endian);
+ /**
+- *    of_get_parent - Get a node's parent if any
+- *    @node:  Node to get parent
++ * of_get_parent - Get a node's parent if any
++ * @node:     Node to get parent
+  *
+- *    Returns a node pointer with refcount incremented, use
+- *    of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_get_parent(const struct device_node *node)
+ {
+@@ -673,15 +673,15 @@ struct device_node *of_get_parent(const
+ EXPORT_SYMBOL(of_get_parent);
+ /**
+- *    of_get_next_parent - Iterate to a node's parent
+- *    @node:  Node to get parent of
++ * of_get_next_parent - Iterate to a node's parent
++ * @node:     Node to get parent of
+  *
+- *    This is like of_get_parent() except that it drops the
+- *    refcount on the passed node, making it suitable for iterating
+- *    through a node's parents.
++ * This is like of_get_parent() except that it drops the
++ * refcount on the passed node, making it suitable for iterating
++ * through a node's parents.
+  *
+- *    Returns a node pointer with refcount incremented, use
+- *    of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_get_next_parent(struct device_node *node)
+ {
+@@ -719,13 +719,13 @@ static struct device_node *__of_get_next
+            child = __of_get_next_child(parent, child))
+ /**
+- *    of_get_next_child - Iterate a node childs
+- *    @node:  parent node
+- *    @prev:  previous child of the parent node, or NULL to get first
+- *
+- *    Returns a node pointer with refcount incremented, use of_node_put() on
+- *    it when done. Returns NULL when prev is the last child. Decrements the
+- *    refcount of prev.
++ * of_get_next_child - Iterate a node childs
++ * @node:     parent node
++ * @prev:     previous child of the parent node, or NULL to get first
++ *
++ * Return: A node pointer with refcount incremented, use of_node_put() on
++ * it when done. Returns NULL when prev is the last child. Decrements the
++ * refcount of prev.
+  */
+ struct device_node *of_get_next_child(const struct device_node *node,
+       struct device_node *prev)
+@@ -741,12 +741,12 @@ struct device_node *of_get_next_child(co
+ EXPORT_SYMBOL(of_get_next_child);
+ /**
+- *    of_get_next_available_child - Find the next available child node
+- *    @node:  parent node
+- *    @prev:  previous child of the parent node, or NULL to get first
++ * of_get_next_available_child - Find the next available child node
++ * @node:     parent node
++ * @prev:     previous child of the parent node, or NULL to get first
+  *
+- *      This function is like of_get_next_child(), except that it
+- *      automatically skips any disabled nodes (i.e. status = "disabled").
++ * This function is like of_get_next_child(), except that it
++ * automatically skips any disabled nodes (i.e. status = "disabled").
+  */
+ struct device_node *of_get_next_available_child(const struct device_node *node,
+       struct device_node *prev)
+@@ -772,12 +772,12 @@ struct device_node *of_get_next_availabl
+ EXPORT_SYMBOL(of_get_next_available_child);
+ /**
+- *    of_get_next_cpu_node - Iterate on cpu nodes
+- *    @prev:  previous child of the /cpus node, or NULL to get first
++ * of_get_next_cpu_node - Iterate on cpu nodes
++ * @prev:     previous child of the /cpus node, or NULL to get first
+  *
+- *    Returns a cpu node pointer with refcount incremented, use of_node_put()
+- *    on it when done. Returns NULL when prev is the last child. Decrements
+- *    the refcount of prev.
++ * Return: A cpu node pointer with refcount incremented, use of_node_put()
++ * on it when done. Returns NULL when prev is the last child. Decrements
++ * the refcount of prev.
+  */
+ struct device_node *of_get_next_cpu_node(struct device_node *prev)
+ {
+@@ -834,15 +834,15 @@ struct device_node *of_get_compatible_ch
+ EXPORT_SYMBOL(of_get_compatible_child);
+ /**
+- *    of_get_child_by_name - Find the child node by name for a given parent
+- *    @node:  parent node
+- *    @name:  child name to look for.
+- *
+- *      This function looks for child node for given matching name
+- *
+- *    Returns a node pointer if found, with refcount incremented, use
+- *    of_node_put() on it when done.
+- *    Returns NULL if node is not found.
++ * of_get_child_by_name - Find the child node by name for a given parent
++ * @node:     parent node
++ * @name:     child name to look for.
++ *
++ * This function looks for child node for given matching name
++ *
++ * Return: A node pointer if found, with refcount incremented, use
++ * of_node_put() on it when done.
++ * Returns NULL if node is not found.
+  */
+ struct device_node *of_get_child_by_name(const struct device_node *node,
+                               const char *name)
+@@ -893,22 +893,22 @@ struct device_node *__of_find_node_by_fu
+ }
+ /**
+- *    of_find_node_opts_by_path - Find a node matching a full OF path
+- *    @path: Either the full path to match, or if the path does not
+- *           start with '/', the name of a property of the /aliases
+- *           node (an alias).  In the case of an alias, the node
+- *           matching the alias' value will be returned.
+- *    @opts: Address of a pointer into which to store the start of
+- *           an options string appended to the end of the path with
+- *           a ':' separator.
+- *
+- *    Valid paths:
+- *            /foo/bar        Full path
+- *            foo             Valid alias
+- *            foo/bar         Valid alias + relative path
++ * of_find_node_opts_by_path - Find a node matching a full OF path
++ * @path: Either the full path to match, or if the path does not
++ *       start with '/', the name of a property of the /aliases
++ *       node (an alias).  In the case of an alias, the node
++ *       matching the alias' value will be returned.
++ * @opts: Address of a pointer into which to store the start of
++ *       an options string appended to the end of the path with
++ *       a ':' separator.
++ *
++ * Valid paths:
++ *  * /foo/bar        Full path
++ *  * foo     Valid alias
++ *  * foo/bar Valid alias + relative path
+  *
+- *    Returns a node pointer with refcount incremented, use
+- *    of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_find_node_opts_by_path(const char *path, const char **opts)
+ {
+@@ -958,15 +958,15 @@ struct device_node *of_find_node_opts_by
+ EXPORT_SYMBOL(of_find_node_opts_by_path);
+ /**
+- *    of_find_node_by_name - Find a node by its "name" property
+- *    @from:  The node to start searching from or NULL; the node
++ * of_find_node_by_name - Find a node by its "name" property
++ * @from:     The node to start searching from or NULL; the node
+  *            you pass will not be searched, only the next one
+  *            will. Typically, you pass what the previous call
+  *            returned. of_node_put() will be called on @from.
+- *    @name:  The name string to match against
++ * @name:     The name string to match against
+  *
+- *    Returns a node pointer with refcount incremented, use
+- *    of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_find_node_by_name(struct device_node *from,
+       const char *name)
+@@ -985,16 +985,16 @@ struct device_node *of_find_node_by_name
+ EXPORT_SYMBOL(of_find_node_by_name);
+ /**
+- *    of_find_node_by_type - Find a node by its "device_type" property
+- *    @from:  The node to start searching from, or NULL to start searching
++ * of_find_node_by_type - Find a node by its "device_type" property
++ * @from:     The node to start searching from, or NULL to start searching
+  *            the entire device tree. The node you pass will not be
+  *            searched, only the next one will; typically, you pass
+  *            what the previous call returned. of_node_put() will be
+  *            called on from for you.
+- *    @type:  The type string to match against
++ * @type:     The type string to match against
+  *
+- *    Returns a node pointer with refcount incremented, use
+- *    of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_find_node_by_type(struct device_node *from,
+       const char *type)
+@@ -1013,18 +1013,18 @@ struct device_node *of_find_node_by_type
+ EXPORT_SYMBOL(of_find_node_by_type);
+ /**
+- *    of_find_compatible_node - Find a node based on type and one of the
++ * of_find_compatible_node - Find a node based on type and one of the
+  *                                tokens in its "compatible" property
+- *    @from:          The node to start searching from or NULL, the node
+- *                    you pass will not be searched, only the next one
+- *                    will; typically, you pass what the previous call
+- *                    returned. of_node_put() will be called on it
+- *    @type:          The type string to match "device_type" or NULL to ignore
+- *    @compatible:    The string to match to one of the tokens in the device
+- *                    "compatible" list.
++ * @from:     The node to start searching from or NULL, the node
++ *            you pass will not be searched, only the next one
++ *            will; typically, you pass what the previous call
++ *            returned. of_node_put() will be called on it
++ * @type:     The type string to match "device_type" or NULL to ignore
++ * @compatible:       The string to match to one of the tokens in the device
++ *            "compatible" list.
+  *
+- *    Returns a node pointer with refcount incremented, use
+- *    of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_find_compatible_node(struct device_node *from,
+       const char *type, const char *compatible)
+@@ -1044,16 +1044,16 @@ struct device_node *of_find_compatible_n
+ EXPORT_SYMBOL(of_find_compatible_node);
+ /**
+- *    of_find_node_with_property - Find a node which has a property with
+- *                                   the given name.
+- *    @from:          The node to start searching from or NULL, the node
+- *                    you pass will not be searched, only the next one
+- *                    will; typically, you pass what the previous call
+- *                    returned. of_node_put() will be called on it
+- *    @prop_name:     The name of the property to look for.
++ * of_find_node_with_property - Find a node which has a property with
++ *                              the given name.
++ * @from:     The node to start searching from or NULL, the node
++ *            you pass will not be searched, only the next one
++ *            will; typically, you pass what the previous call
++ *            returned. of_node_put() will be called on it
++ * @prop_name:        The name of the property to look for.
+  *
+- *    Returns a node pointer with refcount incremented, use
+- *    of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_find_node_with_property(struct device_node *from,
+       const char *prop_name)
+@@ -1102,10 +1102,10 @@ const struct of_device_id *__of_match_no
+ /**
+  * of_match_node - Tell if a device_node has a matching of_match structure
+- *    @matches:       array of of device match structures to search in
+- *    @node:          the of device structure to match against
++ * @matches:  array of of device match structures to search in
++ * @node:     the of device structure to match against
+  *
+- *    Low level utility function used by device matching.
++ * Low level utility function used by device matching.
+  */
+ const struct of_device_id *of_match_node(const struct of_device_id *matches,
+                                        const struct device_node *node)
+@@ -1121,17 +1121,17 @@ const struct of_device_id *of_match_node
+ EXPORT_SYMBOL(of_match_node);
+ /**
+- *    of_find_matching_node_and_match - Find a node based on an of_device_id
+- *                                      match table.
+- *    @from:          The node to start searching from or NULL, the node
+- *                    you pass will not be searched, only the next one
+- *                    will; typically, you pass what the previous call
+- *                    returned. of_node_put() will be called on it
+- *    @matches:       array of of device match structures to search in
+- *    @match:         Updated to point at the matches entry which matched
++ * of_find_matching_node_and_match - Find a node based on an of_device_id
++ *                                 match table.
++ * @from:     The node to start searching from or NULL, the node
++ *            you pass will not be searched, only the next one
++ *            will; typically, you pass what the previous call
++ *            returned. of_node_put() will be called on it
++ * @matches:  array of of device match structures to search in
++ * @match:    Updated to point at the matches entry which matched
+  *
+- *    Returns a node pointer with refcount incremented, use
+- *    of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_find_matching_node_and_match(struct device_node *from,
+                                       const struct of_device_id *matches,
+@@ -1465,21 +1465,21 @@ EXPORT_SYMBOL(of_parse_phandle);
+  * Caller is responsible to call of_node_put() on the returned out_args->np
+  * pointer.
+  *
+- * Example:
++ * Example::
+  *
+- * phandle1: node1 {
++ *  phandle1: node1 {
+  *    #list-cells = <2>;
+- * }
++ *  };
+  *
+- * phandle2: node2 {
++ *  phandle2: node2 {
+  *    #list-cells = <1>;
+- * }
++ *  };
+  *
+- * node3 {
++ *  node3 {
+  *    list = <&phandle1 1 2 &phandle2 3>;
+- * }
++ *  };
+  *
+- * To get a device_node of the `node2' node you may call this:
++ * To get a device_node of the ``node2`` node you may call this:
+  * of_parse_phandle_with_args(node3, "list", "#list-cells", 1, &args);
+  */
+ int of_parse_phandle_with_args(const struct device_node *np, const char *list_name,
+@@ -1517,29 +1517,29 @@ EXPORT_SYMBOL(of_parse_phandle_with_args
+  * Caller is responsible to call of_node_put() on the returned out_args->np
+  * pointer.
+  *
+- * Example:
+- *
+- * phandle1: node1 {
+- *    #list-cells = <2>;
+- * }
+- *
+- * phandle2: node2 {
+- *    #list-cells = <1>;
+- * }
++ * Example::
+  *
+- * phandle3: node3 {
+- *    #list-cells = <1>;
+- *    list-map = <0 &phandle2 3>,
+- *               <1 &phandle2 2>,
+- *               <2 &phandle1 5 1>;
+- *    list-map-mask = <0x3>;
+- * };
+- *
+- * node4 {
+- *    list = <&phandle1 1 2 &phandle3 0>;
+- * }
++ *  phandle1: node1 {
++ *    #list-cells = <2>;
++ *  };
++ *
++ *  phandle2: node2 {
++ *    #list-cells = <1>;
++ *  };
++ *
++ *  phandle3: node3 {
++ *    #list-cells = <1>;
++ *    list-map = <0 &phandle2 3>,
++ *               <1 &phandle2 2>,
++ *               <2 &phandle1 5 1>;
++ *    list-map-mask = <0x3>;
++ *  };
++ *
++ *  node4 {
++ *    list = <&phandle1 1 2 &phandle3 0>;
++ *  };
+  *
+- * To get a device_node of the `node2' node you may call this:
++ * To get a device_node of the ``node2`` node you may call this:
+  * of_parse_phandle_with_args(node4, "list", "list", 1, &args);
+  */
+ int of_parse_phandle_with_args_map(const struct device_node *np,
+@@ -1699,19 +1699,19 @@ EXPORT_SYMBOL(of_parse_phandle_with_args
+  * Caller is responsible to call of_node_put() on the returned out_args->np
+  * pointer.
+  *
+- * Example:
++ * Example::
+  *
+- * phandle1: node1 {
+- * }
++ *  phandle1: node1 {
++ *  };
+  *
+- * phandle2: node2 {
+- * }
++ *  phandle2: node2 {
++ *  };
+  *
+- * node3 {
+- *    list = <&phandle1 0 2 &phandle2 2 3>;
+- * }
++ *  node3 {
++ *    list = <&phandle1 0 2 &phandle2 2 3>;
++ *  };
+  *
+- * To get a device_node of the `node2' node you may call this:
++ * To get a device_node of the ``node2`` node you may call this:
+  * of_parse_phandle_with_fixed_args(node3, "list", 2, 1, &args);
+  */
+ int of_parse_phandle_with_fixed_args(const struct device_node *np,
+@@ -1957,13 +1957,12 @@ static void of_alias_add(struct alias_pr
+ /**
+  * of_alias_scan - Scan all properties of the 'aliases' node
++ * @dt_alloc: An allocator that provides a virtual address to memory
++ *            for storing the resulting tree
+  *
+  * The function scans all the properties of the 'aliases' node and populates
+  * the global lookup table with the properties.  It returns the
+  * number of alias properties found, or an error code in case of failure.
+- *
+- * @dt_alloc: An allocator that provides a virtual address to memory
+- *            for storing the resulting tree
+  */
+ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
+ {
+@@ -2158,12 +2157,12 @@ bool of_console_check(struct device_node
+ EXPORT_SYMBOL_GPL(of_console_check);
+ /**
+- *    of_find_next_cache_node - Find a node's subsidiary cache
+- *    @np:    node of type "cpu" or "cache"
++ * of_find_next_cache_node - Find a node's subsidiary cache
++ * @np:       node of type "cpu" or "cache"
+  *
+- *    Returns a node pointer with refcount incremented, use
+- *    of_node_put() on it when done.  Caller should hold a reference
+- *    to np.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.  Caller should hold a reference
++ * to np.
+  */
+ struct device_node *of_find_next_cache_node(const struct device_node *np)
+ {
+--- a/drivers/of/fdt.c
++++ b/drivers/of/fdt.c
+@@ -349,11 +349,6 @@ static int unflatten_dt_nodes(const void
+ /**
+  * __unflatten_device_tree - create tree of device_nodes from flat blob
+- *
+- * unflattens a device-tree, creating the
+- * tree of struct device_node. It also fills the "name" and "type"
+- * pointers of the nodes so the normal device-tree walking functions
+- * can be used.
+  * @blob: The blob to expand
+  * @dad: Parent device node
+  * @mynodes: The device_node tree created by the call
+@@ -361,6 +356,10 @@ static int unflatten_dt_nodes(const void
+  * for the resulting tree
+  * @detached: if true set OF_DETACHED on @mynodes
+  *
++ * unflattens a device-tree, creating the tree of struct device_node. It also
++ * fills the "name" and "type" pointers of the nodes so the normal device-tree
++ * walking functions can be used.
++ *
+  * Returns NULL on failure or the memory chunk containing the unflattened
+  * device tree on success.
+  */
diff --git a/target/linux/generic/backport-5.10/732-v5.13-0006-of-Add-missing-Return-section-in-kerneldoc-comments.patch b/target/linux/generic/backport-5.10/732-v5.13-0006-of-Add-missing-Return-section-in-kerneldoc-comments.patch
new file mode 100644 (file)
index 0000000..9c99ccb
--- /dev/null
@@ -0,0 +1,787 @@
+From 8c8239c2c1fb82f171cb22a707f3bb88a2f22109 Mon Sep 17 00:00:00 2001
+From: Rob Herring <robh@kernel.org>
+Date: Thu, 25 Mar 2021 10:47:12 -0600
+Subject: [PATCH] of: Add missing 'Return' section in kerneldoc comments
+
+Many of the DT kerneldoc comments are lacking a 'Return' section. Let's
+add the section in cases we have a description of return values. There's
+still some cases where the return values are not documented.
+
+Cc: Frank Rowand <frowand.list@gmail.com>
+Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
+Signed-off-by: Rob Herring <robh@kernel.org>
+Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
+Link: https://lore.kernel.org/r/20210325164713.1296407-8-robh@kernel.org
+---
+ drivers/of/base.c     | 39 +++++++++++++------------
+ drivers/of/dynamic.c  | 19 ++++++++-----
+ drivers/of/fdt.c      |  8 +++---
+ drivers/of/irq.c      | 14 ++++-----
+ drivers/of/overlay.c  | 16 +++++------
+ drivers/of/platform.c | 10 +++----
+ drivers/of/property.c | 66 +++++++++++++++++++++++++++----------------
+ include/linux/of.h    | 63 ++++++++++++++++++++++++++---------------
+ 8 files changed, 140 insertions(+), 95 deletions(-)
+
+--- a/drivers/of/base.c
++++ b/drivers/of/base.c
+@@ -244,7 +244,7 @@ struct device_node *__of_find_all_nodes(
+  * @prev:     Previous node or NULL to start iteration
+  *            of_node_put() will be called on it
+  *
+- * Returns a node pointer with refcount incremented, use
++ * Return: A node pointer with refcount incremented, use
+  * of_node_put() on it when done.
+  */
+ struct device_node *of_find_all_nodes(struct device_node *prev)
+@@ -374,7 +374,7 @@ bool __weak arch_find_n_match_cpu_physic
+  * before booting secondary cores. This function uses arch_match_cpu_phys_id
+  * which can be overridden by architecture specific implementation.
+  *
+- * Returns a node pointer for the logical cpu with refcount incremented, use
++ * Return: A node pointer for the logical cpu with refcount incremented, use
+  * of_node_put() on it when done. Returns NULL if not found.
+  */
+ struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
+@@ -394,8 +394,8 @@ EXPORT_SYMBOL(of_get_cpu_node);
+  *
+  * @cpu_node: Pointer to the device_node for CPU.
+  *
+- * Returns the logical CPU number of the given CPU device_node.
+- * Returns -ENODEV if the CPU is not found.
++ * Return: The logical CPU number of the given CPU device_node or -ENODEV if the
++ * CPU is not found.
+  */
+ int of_cpu_node_to_id(struct device_node *cpu_node)
+ {
+@@ -427,7 +427,7 @@ EXPORT_SYMBOL(of_cpu_node_to_id);
+  * bindings. This function check for both and returns the idle state node for
+  * the requested index.
+  *
+- * In case an idle state node is found at @index, the refcount is incremented
++ * Return: An idle state node if found at @index. The refcount is incremented
+  * for it, so call of_node_put() on it when done. Returns NULL if not found.
+  */
+ struct device_node *of_get_cpu_state_node(struct device_node *cpu_node,
+@@ -561,7 +561,7 @@ int of_device_compatible_match(struct de
+  * of_machine_is_compatible - Test root of device tree for a given compatible value
+  * @compat: compatible string to look for in root node's compatible property.
+  *
+- * Returns a positive integer if the root node has the given value in its
++ * Return: A positive integer if the root node has the given value in its
+  * compatible property.
+  */
+ int of_machine_is_compatible(const char *compat)
+@@ -583,7 +583,7 @@ EXPORT_SYMBOL(of_machine_is_compatible);
+  *
+  *  @device: Node to check for availability, with locks already held
+  *
+- *  Returns true if the status property is absent or set to "okay" or "ok",
++ *  Return: True if the status property is absent or set to "okay" or "ok",
+  *  false otherwise
+  */
+ static bool __of_device_is_available(const struct device_node *device)
+@@ -611,7 +611,7 @@ static bool __of_device_is_available(con
+  *
+  *  @device: Node to check for availability
+  *
+- *  Returns true if the status property is absent or set to "okay" or "ok",
++ *  Return: True if the status property is absent or set to "okay" or "ok",
+  *  false otherwise
+  */
+ bool of_device_is_available(const struct device_node *device)
+@@ -632,7 +632,7 @@ EXPORT_SYMBOL(of_device_is_available);
+  *
+  *  @device: Node to check for endianness
+  *
+- *  Returns true if the device has a "big-endian" property, or if the kernel
++ *  Return: True if the device has a "big-endian" property, or if the kernel
+  *  was compiled for BE *and* the device has a "native-endian" property.
+  *  Returns false otherwise.
+  *
+@@ -816,7 +816,7 @@ EXPORT_SYMBOL(of_get_next_cpu_node);
+  * Lookup child node whose compatible property contains the given compatible
+  * string.
+  *
+- * Returns a node pointer with refcount incremented, use of_node_put() on it
++ * Return: a node pointer with refcount incremented, use of_node_put() on it
+  * when done; or NULL if not found.
+  */
+ struct device_node *of_get_compatible_child(const struct device_node *parent,
+@@ -1170,7 +1170,7 @@ EXPORT_SYMBOL(of_find_matching_node_and_
+  * It does this by stripping the manufacturer prefix (as delimited by a ',')
+  * from the first entry in the compatible list property.
+  *
+- * This routine returns 0 on success, <0 on failure.
++ * Return: This routine returns 0 on success, <0 on failure.
+  */
+ int of_modalias_node(struct device_node *node, char *modalias, int len)
+ {
+@@ -1190,7 +1190,7 @@ EXPORT_SYMBOL_GPL(of_modalias_node);
+  * of_find_node_by_phandle - Find a node given a phandle
+  * @handle:   phandle of the node to find
+  *
+- * Returns a node pointer with refcount incremented, use
++ * Return: A node pointer with refcount incremented, use
+  * of_node_put() on it when done.
+  */
+ struct device_node *of_find_node_by_phandle(phandle handle)
+@@ -1431,7 +1431,7 @@ static int __of_parse_phandle_with_args(
+  * @index: For properties holding a table of phandles, this is the index into
+  *         the table
+  *
+- * Returns the device_node pointer with refcount incremented.  Use
++ * Return: The device_node pointer with refcount incremented.  Use
+  * of_node_put() on it when done.
+  */
+ struct device_node *of_parse_phandle(const struct device_node *np,
+@@ -1731,7 +1731,7 @@ EXPORT_SYMBOL(of_parse_phandle_with_fixe
+  * @list_name:        property name that contains a list
+  * @cells_name:       property name that specifies phandles' arguments count
+  *
+- * Returns the number of phandle + argument tuples within a property. It
++ * Return: The number of phandle + argument tuples within a property. It
+  * is a typical pattern to encode a list of phandle and variable
+  * arguments into a single property. The number of arguments is encoded
+  * by a property in the phandle-target node. For example, a gpios
+@@ -2031,7 +2031,9 @@ void of_alias_scan(void * (*dt_alloc)(u6
+  * @stem:     Alias stem of the given device_node
+  *
+  * The function travels the lookup table to get the alias id for the given
+- * device_node and alias stem.  It returns the alias id if found.
++ * device_node and alias stem.
++ *
++ * Return: The alias id if found.
+  */
+ int of_alias_get_id(struct device_node *np, const char *stem)
+ {
+@@ -2140,8 +2142,9 @@ EXPORT_SYMBOL_GPL(of_alias_get_highest_i
+  * @index: Index to use for preferred console.
+  *
+  * Check if the given device node matches the stdout-path property in the
+- * /chosen node. If it does then register it as the preferred console and return
+- * TRUE. Otherwise return FALSE.
++ * /chosen node. If it does then register it as the preferred console.
++ *
++ * Return: TRUE if console successfully setup. Otherwise return FALSE.
+  */
+ bool of_console_check(struct device_node *dn, char *name, int index)
+ {
+@@ -2192,7 +2195,7 @@ struct device_node *of_find_next_cache_n
+  *
+  * @cpu: cpu number(logical index) for which the last cache level is needed
+  *
+- * Returns the the level at which the last cache is present. It is exactly
++ * Return: The the level at which the last cache is present. It is exactly
+  * same as  the total number of cache levels for the given logical cpu.
+  */
+ int of_find_last_cache_level(unsigned int cpu)
+--- a/drivers/of/dynamic.c
++++ b/drivers/of/dynamic.c
+@@ -27,7 +27,7 @@ static struct device_node *kobj_to_devic
+  * @node:     Node to inc refcount, NULL is supported to simplify writing of
+  *            callers
+  *
+- * Returns node.
++ * Return: The node with refcount incremented.
+  */
+ struct device_node *of_node_get(struct device_node *node)
+ {
+@@ -104,7 +104,8 @@ int of_reconfig_notify(unsigned long act
+  * @arg               - argument of the of notifier
+  *
+  * Returns the new state of a device based on the notifier used.
+- * Returns 0 on device going from enabled to disabled, 1 on device
++ *
++ * Return: 0 on device going from enabled to disabled, 1 on device
+  * going from disabled to enabled and -1 on no change.
+  */
+ int of_reconfig_get_state_change(unsigned long action, struct of_reconfig_data *pr)
+@@ -371,7 +372,8 @@ void of_node_release(struct kobject *kob
+  * property structure and the property name & contents. The property's
+  * flags have the OF_DYNAMIC bit set so that we can differentiate between
+  * dynamically allocated properties and not.
+- * Returns the newly allocated property or NULL on out of memory error.
++ *
++ * Return: The newly allocated property or NULL on out of memory error.
+  */
+ struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags)
+ {
+@@ -414,7 +416,7 @@ struct property *__of_prop_dup(const str
+  * another node.  The node data are dynamically allocated and all the node
+  * flags have the OF_DYNAMIC & OF_DETACHED bits set.
+  *
+- * Returns the newly allocated node or NULL on out of memory error.
++ * Return: The newly allocated node or NULL on out of memory error.
+  */
+ struct device_node *__of_node_dup(const struct device_node *np,
+                                 const char *full_name)
+@@ -780,7 +782,8 @@ static int __of_changeset_apply(struct o
+  * Any side-effects of live tree state changes are applied here on
+  * success, like creation/destruction of devices and side-effects
+  * like creation of sysfs properties and directories.
+- * Returns 0 on success, a negative error value in case of an error.
++ *
++ * Return: 0 on success, a negative error value in case of an error.
+  * On error the partially applied effects are reverted.
+  */
+ int of_changeset_apply(struct of_changeset *ocs)
+@@ -874,7 +877,8 @@ static int __of_changeset_revert(struct
+  * was before the application.
+  * Any side-effects like creation/destruction of devices and
+  * removal of sysfs properties and directories are applied.
+- * Returns 0 on success, a negative error value in case of an error.
++ *
++ * Return: 0 on success, a negative error value in case of an error.
+  */
+ int of_changeset_revert(struct of_changeset *ocs)
+ {
+@@ -902,7 +906,8 @@ EXPORT_SYMBOL_GPL(of_changeset_revert);
+  * + OF_RECONFIG_ADD_PROPERTY
+  * + OF_RECONFIG_REMOVE_PROPERTY,
+  * + OF_RECONFIG_UPDATE_PROPERTY
+- * Returns 0 on success, a negative error value in case of an error.
++ *
++ * Return: 0 on success, a negative error value in case of an error.
+  */
+ int of_changeset_action(struct of_changeset *ocs, unsigned long action,
+               struct device_node *np, struct property *prop)
+--- a/drivers/of/fdt.c
++++ b/drivers/of/fdt.c
+@@ -282,7 +282,7 @@ static void reverse_nodes(struct device_
+  * @dad: Parent struct device_node
+  * @nodepp: The device_node tree created by the call
+  *
+- * It returns the size of unflattened device tree or error code
++ * Return: The size of unflattened device tree or error code
+  */
+ static int unflatten_dt_nodes(const void *blob,
+                             void *mem,
+@@ -360,7 +360,7 @@ static int unflatten_dt_nodes(const void
+  * fills the "name" and "type" pointers of the nodes so the normal device-tree
+  * walking functions can be used.
+  *
+- * Returns NULL on failure or the memory chunk containing the unflattened
++ * Return: NULL on failure or the memory chunk containing the unflattened
+  * device tree on success.
+  */
+ void *__unflatten_device_tree(const void *blob,
+@@ -441,7 +441,7 @@ static DEFINE_MUTEX(of_fdt_unflatten_mut
+  * pointers of the nodes so the normal device-tree walking functions
+  * can be used.
+  *
+- * Returns NULL on failure or the memory chunk containing the unflattened
++ * Return: NULL on failure or the memory chunk containing the unflattened
+  * device tree on success.
+  */
+ void *of_fdt_unflatten_tree(const unsigned long *blob,
+@@ -715,7 +715,7 @@ const void *__init of_get_flat_dt_prop(u
+  * @node: node to test
+  * @compat: compatible string to compare with compatible list.
+  *
+- * On match, returns a non-zero value with smaller values returned for more
++ * Return: a non-zero value on match with smaller values returned for more
+  * specific compatible values.
+  */
+ static int of_fdt_is_compatible(const void *blob,
+--- a/drivers/of/irq.c
++++ b/drivers/of/irq.c
+@@ -48,7 +48,7 @@ EXPORT_SYMBOL_GPL(irq_of_parse_and_map);
+  * of_irq_find_parent - Given a device node, find its interrupt parent node
+  * @child: pointer to device node
+  *
+- * Returns a pointer to the interrupt parent node, or NULL if the interrupt
++ * Return: A pointer to the interrupt parent node, or NULL if the interrupt
+  * parent could not be determined.
+  */
+ struct device_node *of_irq_find_parent(struct device_node *child)
+@@ -81,14 +81,14 @@ EXPORT_SYMBOL_GPL(of_irq_find_parent);
+  * @addr:     address specifier (start of "reg" property of the device) in be32 format
+  * @out_irq:  structure of_phandle_args updated by this function
+  *
+- * Returns 0 on success and a negative number on error
+- *
+  * This function is a low-level interrupt tree walking function. It
+  * can be used to do a partial walk with synthetized reg and interrupts
+  * properties, for example when resolving PCI interrupts when no device
+  * node exist for the parent. It takes an interrupt specifier structure as
+  * input, walks the tree looking for any interrupt-map properties, translates
+  * the specifier for each map, and then returns the translated map.
++ *
++ * Return: 0 on success and a negative number on error
+  */
+ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
+ {
+@@ -380,7 +380,7 @@ EXPORT_SYMBOL_GPL(of_irq_to_resource);
+  * @dev: pointer to device tree node
+  * @index: zero-based index of the IRQ
+  *
+- * Returns Linux IRQ number on success, or 0 on the IRQ mapping failure, or
++ * Return: Linux IRQ number on success, or 0 on the IRQ mapping failure, or
+  * -EPROBE_DEFER if the IRQ domain is not yet created, or error code in case
+  * of any other failure.
+  */
+@@ -407,7 +407,7 @@ EXPORT_SYMBOL_GPL(of_irq_get);
+  * @dev: pointer to device tree node
+  * @name: IRQ name
+  *
+- * Returns Linux IRQ number on success, or 0 on the IRQ mapping failure, or
++ * Return: Linux IRQ number on success, or 0 on the IRQ mapping failure, or
+  * -EPROBE_DEFER if the IRQ domain is not yet created, or error code in case
+  * of any other failure.
+  */
+@@ -447,7 +447,7 @@ int of_irq_count(struct device_node *dev
+  * @res: array of resources to fill in
+  * @nr_irqs: the number of IRQs (and upper bound for num of @res elements)
+  *
+- * Returns the size of the filled in table (up to @nr_irqs).
++ * Return: The size of the filled in table (up to @nr_irqs).
+  */
+ int of_irq_to_resource_table(struct device_node *dev, struct resource *res,
+               int nr_irqs)
+@@ -602,7 +602,7 @@ static u32 __of_msi_map_id(struct device
+  * Walk up the device hierarchy looking for devices with a "msi-map"
+  * property.  If found, apply the mapping to @id_in.
+  *
+- * Returns the mapped MSI ID.
++ * Return: The mapped MSI ID.
+  */
+ u32 of_msi_map_id(struct device *dev, struct device_node *msi_np, u32 id_in)
+ {
+--- a/drivers/of/overlay.c
++++ b/drivers/of/overlay.c
+@@ -296,7 +296,7 @@ err_free_target_path:
+  *
+  * Update of property in symbols node is not allowed.
+  *
+- * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
++ * Return: 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
+  * invalid @overlay.
+  */
+ static int add_changeset_property(struct overlay_changeset *ovcs,
+@@ -401,7 +401,7 @@ static int add_changeset_property(struct
+  *
+  * NOTE_2: Multiple mods of created nodes not supported.
+  *
+- * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
++ * Return: 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
+  * invalid @overlay.
+  */
+ static int add_changeset_node(struct overlay_changeset *ovcs,
+@@ -473,7 +473,7 @@ static int add_changeset_node(struct ove
+  *
+  * Do not allow symbols node to have any children.
+  *
+- * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
++ * Return: 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
+  * invalid @overlay_node.
+  */
+ static int build_changeset_next_level(struct overlay_changeset *ovcs,
+@@ -604,7 +604,7 @@ static int find_dup_cset_prop(struct ove
+  * the same node or duplicate {add, delete, or update} properties entries
+  * for the same property.
+  *
+- * Returns 0 on success, or -EINVAL if duplicate changeset entry found.
++ * Return: 0 on success, or -EINVAL if duplicate changeset entry found.
+  */
+ static int changeset_dup_entry_check(struct overlay_changeset *ovcs)
+ {
+@@ -628,7 +628,7 @@ static int changeset_dup_entry_check(str
+  * any portions of the changeset that were successfully created will remain
+  * in @ovcs->cset.
+  *
+- * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
++ * Return: 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
+  * invalid overlay in @ovcs->fragments[].
+  */
+ static int build_changeset(struct overlay_changeset *ovcs)
+@@ -724,7 +724,7 @@ static struct device_node *find_target(s
+  * the top level of @tree.  The relevant top level nodes are the fragment
+  * nodes and the __symbols__ node.  Any other top level node will be ignored.
+  *
+- * Returns 0 on success, -ENOMEM if memory allocation failure, -EINVAL if error
++ * Return: 0 on success, -ENOMEM if memory allocation failure, -EINVAL if error
+  * detected in @tree, or -ENOSPC if idr_alloc() error.
+  */
+ static int init_overlay_changeset(struct overlay_changeset *ovcs,
+@@ -1179,7 +1179,7 @@ static int overlay_removal_is_ok(struct
+  * If an error is returned by an overlay changeset post-remove notifier
+  * then no further overlay changeset post-remove notifier will be called.
+  *
+- * Returns 0 on success, or a negative error number.  *ovcs_id is set to
++ * Return: 0 on success, or a negative error number.  *ovcs_id is set to
+  * zero after reverting the changeset, even if a subsequent error occurs.
+  */
+ int of_overlay_remove(int *ovcs_id)
+@@ -1257,7 +1257,7 @@ EXPORT_SYMBOL_GPL(of_overlay_remove);
+  *
+  * Removes all overlays from the system in the correct order.
+  *
+- * Returns 0 on success, or a negative error number
++ * Return: 0 on success, or a negative error number
+  */
+ int of_overlay_remove_all(void)
+ {
+--- a/drivers/of/platform.c
++++ b/drivers/of/platform.c
+@@ -44,7 +44,7 @@ static const struct of_device_id of_skip
+  * Takes a reference to the embedded struct device which needs to be dropped
+  * after use.
+  *
+- * Returns platform_device pointer, or NULL if not found
++ * Return: platform_device pointer, or NULL if not found
+  */
+ struct platform_device *of_find_device_by_node(struct device_node *np)
+ {
+@@ -160,7 +160,7 @@ EXPORT_SYMBOL(of_device_alloc);
+  * @platform_data: pointer to populate platform_data pointer with
+  * @parent: Linux device model parent device.
+  *
+- * Returns pointer to created platform device, or NULL if a device was not
++ * Return: Pointer to created platform device, or NULL if a device was not
+  * registered.  Unavailable devices will not get registered.
+  */
+ static struct platform_device *of_platform_device_create_pdata(
+@@ -204,7 +204,7 @@ err_clear_flag:
+  * @bus_id: name to assign device
+  * @parent: Linux device model parent device.
+  *
+- * Returns pointer to created platform device, or NULL if a device was not
++ * Return: Pointer to created platform device, or NULL if a device was not
+  * registered.  Unavailable devices will not get registered.
+  */
+ struct platform_device *of_platform_device_create(struct device_node *np,
+@@ -463,7 +463,7 @@ EXPORT_SYMBOL(of_platform_bus_probe);
+  * New board support should be using this function instead of
+  * of_platform_bus_probe().
+  *
+- * Returns 0 on success, < 0 on failure.
++ * Return: 0 on success, < 0 on failure.
+  */
+ int of_platform_populate(struct device_node *root,
+                       const struct of_device_id *matches,
+@@ -608,7 +608,7 @@ static void devm_of_platform_populate_re
+  * Similar to of_platform_populate(), but will automatically call
+  * of_platform_depopulate() when the device is unbound from the bus.
+  *
+- * Returns 0 on success, < 0 on failure.
++ * Return: 0 on success, < 0 on failure.
+  */
+ int devm_of_platform_populate(struct device *dev)
+ {
+--- a/drivers/of/property.c
++++ b/drivers/of/property.c
+@@ -60,9 +60,11 @@ EXPORT_SYMBOL(of_graph_is_present);
+  * @elem_size:        size of the individual element
+  *
+  * Search for a property in a device node and count the number of elements of
+- * size elem_size in it. Returns number of elements on sucess, -EINVAL if the
+- * property does not exist or its length does not match a multiple of elem_size
+- * and -ENODATA if the property does not have a value.
++ * size elem_size in it.
++ *
++ * Return: The number of elements on sucess, -EINVAL if the property does not
++ * exist or its length does not match a multiple of elem_size and -ENODATA if
++ * the property does not have a value.
+  */
+ int of_property_count_elems_of_size(const struct device_node *np,
+                               const char *propname, int elem_size)
+@@ -94,8 +96,9 @@ EXPORT_SYMBOL_GPL(of_property_count_elem
+  * @len:      if !=NULL, actual length is written to here
+  *
+  * Search for a property in a device node and valid the requested size.
+- * Returns the property value on success, -EINVAL if the property does not
+- *  exist, -ENODATA if property does not have a value, and -EOVERFLOW if the
++ *
++ * Return: The property value on success, -EINVAL if the property does not
++ * exist, -ENODATA if property does not have a value, and -EOVERFLOW if the
+  * property data is too small or too large.
+  *
+  */
+@@ -128,7 +131,9 @@ static void *of_find_property_value_of_s
+  * @out_value:        pointer to return value, modified only if no error.
+  *
+  * Search for a property in a device node and read nth 32-bit value from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
++ * it.
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
+  * -ENODATA if property does not have a value, and -EOVERFLOW if the
+  * property data isn't large enough.
+  *
+@@ -160,7 +165,9 @@ EXPORT_SYMBOL_GPL(of_property_read_u32_i
+  * @out_value:        pointer to return value, modified only if no error.
+  *
+  * Search for a property in a device node and read nth 64-bit value from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
++ * it.
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
+  * -ENODATA if property does not have a value, and -EOVERFLOW if the
+  * property data isn't large enough.
+  *
+@@ -195,12 +202,14 @@ EXPORT_SYMBOL_GPL(of_property_read_u64_i
+  *            sz_min will be read.
+  *
+  * Search for a property in a device node and read 8-bit value(s) from
+- * it. Returns number of elements read on success, -EINVAL if the property
+- * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
+- * if the property data is smaller than sz_min or longer than sz_max.
++ * it.
+  *
+  * dts entry of array should be like:
+- *    property = /bits/ 8 <0x50 0x60 0x70>;
++ *  ``property = /bits/ 8 <0x50 0x60 0x70>;``
++ *
++ * Return: The number of elements read on success, -EINVAL if the property
++ * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
++ * if the property data is smaller than sz_min or longer than sz_max.
+  *
+  * The out_values is modified only if a valid u8 value can be decoded.
+  */
+@@ -243,12 +252,14 @@ EXPORT_SYMBOL_GPL(of_property_read_varia
+  *            sz_min will be read.
+  *
+  * Search for a property in a device node and read 16-bit value(s) from
+- * it. Returns number of elements read on success, -EINVAL if the property
+- * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
+- * if the property data is smaller than sz_min or longer than sz_max.
++ * it.
+  *
+  * dts entry of array should be like:
+- *    property = /bits/ 16 <0x5000 0x6000 0x7000>;
++ *  ``property = /bits/ 16 <0x5000 0x6000 0x7000>;``
++ *
++ * Return: The number of elements read on success, -EINVAL if the property
++ * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
++ * if the property data is smaller than sz_min or longer than sz_max.
+  *
+  * The out_values is modified only if a valid u16 value can be decoded.
+  */
+@@ -291,7 +302,9 @@ EXPORT_SYMBOL_GPL(of_property_read_varia
+  *            sz_min will be read.
+  *
+  * Search for a property in a device node and read 32-bit value(s) from
+- * it. Returns number of elements read on success, -EINVAL if the property
++ * it.
++ *
++ * Return: The number of elements read on success, -EINVAL if the property
+  * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
+  * if the property data is smaller than sz_min or longer than sz_max.
+  *
+@@ -330,7 +343,9 @@ EXPORT_SYMBOL_GPL(of_property_read_varia
+  * @out_value:        pointer to return value, modified only if return value is 0.
+  *
+  * Search for a property in a device node and read a 64-bit value from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
++ * it.
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
+  * -ENODATA if property does not have a value, and -EOVERFLOW if the
+  * property data isn't large enough.
+  *
+@@ -365,7 +380,9 @@ EXPORT_SYMBOL_GPL(of_property_read_u64);
+  *            sz_min will be read.
+  *
+  * Search for a property in a device node and read 64-bit value(s) from
+- * it. Returns number of elements read on success, -EINVAL if the property
++ * it.
++ *
++ * Return: The number of elements read on success, -EINVAL if the property
+  * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
+  * if the property data is smaller than sz_min or longer than sz_max.
+  *
+@@ -407,10 +424,11 @@ EXPORT_SYMBOL_GPL(of_property_read_varia
+  *            return value is 0.
+  *
+  * Search for a property in a device tree node and retrieve a null
+- * terminated string value (pointer to data, not a copy). Returns 0 on
+- * success, -EINVAL if the property does not exist, -ENODATA if property
+- * does not have a value, and -EILSEQ if the string is not null-terminated
+- * within the length of the property data.
++ * terminated string value (pointer to data, not a copy).
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist, -ENODATA if
++ * property does not have a value, and -EILSEQ if the string is not
++ * null-terminated within the length of the property data.
+  *
+  * The out_string pointer is modified only if a valid string can be decoded.
+  */
+@@ -774,7 +792,7 @@ EXPORT_SYMBOL(of_graph_get_remote_port_p
+  * @node: pointer to a local endpoint device_node
+  *
+  * Return: Remote port node associated with remote endpoint node linked
+- *       to @node. Use of_node_put() on it when done.
++ * to @node. Use of_node_put() on it when done.
+  */
+ struct device_node *of_graph_get_remote_port(const struct device_node *node)
+ {
+@@ -807,7 +825,7 @@ EXPORT_SYMBOL(of_graph_get_endpoint_coun
+  * @endpoint: identifier (value of reg property) of the endpoint node
+  *
+  * Return: Remote device node associated with remote endpoint node linked
+- *       to @node. Use of_node_put() on it when done.
++ * to @node. Use of_node_put() on it when done.
+  */
+ struct device_node *of_graph_get_remote_node(const struct device_node *node,
+                                            u32 port, u32 endpoint)
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -424,12 +424,14 @@ extern int of_detach_node(struct device_
+  * @sz:               number of array elements to read
+  *
+  * Search for a property in a device node and read 8-bit value(s) from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
+- * -ENODATA if property does not have a value, and -EOVERFLOW if the
+- * property data isn't large enough.
++ * it.
+  *
+  * dts entry of array should be like:
+- *    property = /bits/ 8 <0x50 0x60 0x70>;
++ *  ``property = /bits/ 8 <0x50 0x60 0x70>;``
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
++ * -ENODATA if property does not have a value, and -EOVERFLOW if the
++ * property data isn't large enough.
+  *
+  * The out_values is modified only if a valid u8 value can be decoded.
+  */
+@@ -454,12 +456,14 @@ static inline int of_property_read_u8_ar
+  * @sz:               number of array elements to read
+  *
+  * Search for a property in a device node and read 16-bit value(s) from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
+- * -ENODATA if property does not have a value, and -EOVERFLOW if the
+- * property data isn't large enough.
++ * it.
+  *
+  * dts entry of array should be like:
+- *    property = /bits/ 16 <0x5000 0x6000 0x7000>;
++ *  ``property = /bits/ 16 <0x5000 0x6000 0x7000>;``
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
++ * -ENODATA if property does not have a value, and -EOVERFLOW if the
++ * property data isn't large enough.
+  *
+  * The out_values is modified only if a valid u16 value can be decoded.
+  */
+@@ -485,7 +489,9 @@ static inline int of_property_read_u16_a
+  * @sz:               number of array elements to read
+  *
+  * Search for a property in a device node and read 32-bit value(s) from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
++ * it.
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
+  * -ENODATA if property does not have a value, and -EOVERFLOW if the
+  * property data isn't large enough.
+  *
+@@ -513,7 +519,9 @@ static inline int of_property_read_u32_a
+  * @sz:               number of array elements to read
+  *
+  * Search for a property in a device node and read 64-bit value(s) from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
++ * it.
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
+  * -ENODATA if property does not have a value, and -EOVERFLOW if the
+  * property data isn't large enough.
+  *
+@@ -1063,7 +1071,9 @@ static inline bool of_node_is_type(const
+  * @propname: name of the property to be searched.
+  *
+  * Search for a property in a device node and count the number of u8 elements
+- * in it. Returns number of elements on sucess, -EINVAL if the property does
++ * in it.
++ *
++ * Return: The number of elements on sucess, -EINVAL if the property does
+  * not exist or its length does not match a multiple of u8 and -ENODATA if the
+  * property does not have a value.
+  */
+@@ -1080,7 +1090,9 @@ static inline int of_property_count_u8_e
+  * @propname: name of the property to be searched.
+  *
+  * Search for a property in a device node and count the number of u16 elements
+- * in it. Returns number of elements on sucess, -EINVAL if the property does
++ * in it.
++ *
++ * Return: The number of elements on sucess, -EINVAL if the property does
+  * not exist or its length does not match a multiple of u16 and -ENODATA if the
+  * property does not have a value.
+  */
+@@ -1097,7 +1109,9 @@ static inline int of_property_count_u16_
+  * @propname: name of the property to be searched.
+  *
+  * Search for a property in a device node and count the number of u32 elements
+- * in it. Returns number of elements on sucess, -EINVAL if the property does
++ * in it.
++ *
++ * Return: The number of elements on sucess, -EINVAL if the property does
+  * not exist or its length does not match a multiple of u32 and -ENODATA if the
+  * property does not have a value.
+  */
+@@ -1114,7 +1128,9 @@ static inline int of_property_count_u32_
+  * @propname: name of the property to be searched.
+  *
+  * Search for a property in a device node and count the number of u64 elements
+- * in it. Returns number of elements on sucess, -EINVAL if the property does
++ * in it.
++ *
++ * Return: The number of elements on sucess, -EINVAL if the property does
+  * not exist or its length does not match a multiple of u64 and -ENODATA if the
+  * property does not have a value.
+  */
+@@ -1135,7 +1151,7 @@ static inline int of_property_count_u64_
+  * Search for a property in a device tree node and retrieve a list of
+  * terminated string values (pointer to data, not a copy) in that property.
+  *
+- * If @out_strs is NULL, the number of strings in the property is returned.
++ * Return: If @out_strs is NULL, the number of strings in the property is returned.
+  */
+ static inline int of_property_read_string_array(const struct device_node *np,
+                                               const char *propname, const char **out_strs,
+@@ -1151,10 +1167,11 @@ static inline int of_property_read_strin
+  * @propname: name of the property to be searched.
+  *
+  * Search for a property in a device tree node and retrieve the number of null
+- * terminated string contain in it. Returns the number of strings on
+- * success, -EINVAL if the property does not exist, -ENODATA if property
+- * does not have a value, and -EILSEQ if the string is not null-terminated
+- * within the length of the property data.
++ * terminated string contain in it.
++ *
++ * Return: The number of strings on success, -EINVAL if the property does not
++ * exist, -ENODATA if property does not have a value, and -EILSEQ if the string
++ * is not null-terminated within the length of the property data.
+  */
+ static inline int of_property_count_strings(const struct device_node *np,
+                                           const char *propname)
+@@ -1174,7 +1191,8 @@ static inline int of_property_count_stri
+  * Search for a property in a device tree node and retrieve a null
+  * terminated string value (pointer to data, not a copy) in the list of strings
+  * contained in that property.
+- * Returns 0 on success, -EINVAL if the property does not exist, -ENODATA if
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist, -ENODATA if
+  * property does not have a value, and -EILSEQ if the string is not
+  * null-terminated within the length of the property data.
+  *
+@@ -1194,7 +1212,8 @@ static inline int of_property_read_strin
+  * @propname: name of the property to be searched.
+  *
+  * Search for a property in a device node.
+- * Returns true if the property exists false otherwise.
++ *
++ * Return: true if the property exists false otherwise.
+  */
+ static inline bool of_property_read_bool(const struct device_node *np,
+                                        const char *propname)
+@@ -1440,7 +1459,7 @@ static inline int of_reconfig_get_state_
+  * of_device_is_system_power_controller - Tells if system-power-controller is found for device_node
+  * @np: Pointer to the given device_node
+  *
+- * return true if present false otherwise
++ * Return: true if present false otherwise
+  */
+ static inline bool of_device_is_system_power_controller(const struct device_node *np)
+ {
diff --git a/target/linux/generic/backport-5.10/732-v5.13-0007-of-base-Fix-spelling-issue-with-function-param-prop.patch b/target/linux/generic/backport-5.10/732-v5.13-0007-of-base-Fix-spelling-issue-with-function-param-prop.patch
new file mode 100644 (file)
index 0000000..64197d7
--- /dev/null
@@ -0,0 +1,54 @@
+From 31e46db02ac1351c84e56a18606d17fc1b8390dd Mon Sep 17 00:00:00 2001
+From: Lee Jones <lee.jones@linaro.org>
+Date: Mon, 29 Mar 2021 16:24:35 +0100
+Subject: [PATCH] of: base: Fix spelling issue with function param 'prop'
+
+Fixes the following W=1 kernel build warning(s):
+
+ drivers/of/base.c:1781: warning: Function parameter or member 'prop' not described in '__of_add_property'
+ drivers/of/base.c:1781: warning: Excess function parameter 'prob' description in '__of_add_property'
+ drivers/of/base.c:1804: warning: Function parameter or member 'prop' not described in 'of_add_property'
+ drivers/of/base.c:1804: warning: Excess function parameter 'prob' description in 'of_add_property'
+ drivers/of/base.c:1855: warning: Function parameter or member 'prop' not described in 'of_remove_property'
+ drivers/of/base.c:1855: warning: Excess function parameter 'prob' description in 'of_remove_property'
+
+Cc: Rob Herring <robh+dt@kernel.org>
+Cc: Frank Rowand <frowand.list@gmail.com>
+Cc: "David S. Miller" <davem@davemloft.net>
+Cc: devicetree@vger.kernel.org
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Link: https://lore.kernel.org/r/20210329152435.900225-1-lee.jones@linaro.org
+Signed-off-by: Rob Herring <robh@kernel.org>
+---
+ drivers/of/base.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/of/base.c
++++ b/drivers/of/base.c
+@@ -1780,7 +1780,7 @@ EXPORT_SYMBOL(of_count_phandle_with_args
+ /**
+  * __of_add_property - Add a property to a node without lock operations
+  * @np:               Caller's Device Node
+- * @prob:     Property to add
++ * @prop:     Property to add
+  */
+ int __of_add_property(struct device_node *np, struct property *prop)
+ {
+@@ -1803,7 +1803,7 @@ int __of_add_property(struct device_node
+ /**
+  * of_add_property - Add a property to a node
+  * @np:               Caller's Device Node
+- * @prob:     Property to add
++ * @prop:     Property to add
+  */
+ int of_add_property(struct device_node *np, struct property *prop)
+ {
+@@ -1849,7 +1849,7 @@ int __of_remove_property(struct device_n
+ /**
+  * of_remove_property - Remove a property from a node.
+  * @np:               Caller's Device Node
+- * @prob:     Property to remove
++ * @prop:     Property to remove
+  *
+  * Note that we don't actually remove it, since we have given out
+  * who-knows-how-many pointers to the data using get-property.
diff --git a/target/linux/generic/backport-5.10/732-v5.13-0008-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch b/target/linux/generic/backport-5.10/732-v5.13-0008-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch
new file mode 100644 (file)
index 0000000..ae46508
--- /dev/null
@@ -0,0 +1,1935 @@
+From 83216e3988cd196183542937c9bd58b279f946af Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael@walle.cc>
+Date: Mon, 12 Apr 2021 19:47:17 +0200
+Subject: [PATCH] of: net: pass the dst buffer to of_get_mac_address()
+
+of_get_mac_address() returns a "const void*" pointer to a MAC address.
+Lately, support to fetch the MAC address by an NVMEM provider was added.
+But this will only work with platform devices. It will not work with
+PCI devices (e.g. of an integrated root complex) and esp. not with DSA
+ports.
+
+There is an of_* variant of the nvmem binding which works without
+devices. The returned data of a nvmem_cell_read() has to be freed after
+use. On the other hand the return of_get_mac_address() points to some
+static data without a lifetime. The trick for now, was to allocate a
+device resource managed buffer which is then returned. This will only
+work if we have an actual device.
+
+Change it, so that the caller of of_get_mac_address() has to supply a
+buffer where the MAC address is written to. Unfortunately, this will
+touch all drivers which use the of_get_mac_address().
+
+Usually the code looks like:
+
+  const char *addr;
+  addr = of_get_mac_address(np);
+  if (!IS_ERR(addr))
+    ether_addr_copy(ndev->dev_addr, addr);
+
+This can then be simply rewritten as:
+
+  of_get_mac_address(np, ndev->dev_addr);
+
+Sometimes is_valid_ether_addr() is used to test the MAC address.
+of_get_mac_address() already makes sure, it just returns a valid MAC
+address. Thus we can just test its return code. But we have to be
+careful if there are still other sources for the MAC address before the
+of_get_mac_address(). In this case we have to keep the
+is_valid_ether_addr() call.
+
+The following coccinelle patch was used to convert common cases to the
+new style. Afterwards, I've manually gone over the drivers and fixed the
+return code variable: either used a new one or if one was already
+available use that. Mansour Moufid, thanks for that coccinelle patch!
+
+<spml>
+@a@
+identifier x;
+expression y, z;
+@@
+- x = of_get_mac_address(y);
++ x = of_get_mac_address(y, z);
+  <...
+- ether_addr_copy(z, x);
+  ...>
+
+@@
+identifier a.x;
+@@
+- if (<+... x ...+>) {}
+
+@@
+identifier a.x;
+@@
+  if (<+... x ...+>) {
+      ...
+  }
+- else {}
+
+@@
+identifier a.x;
+expression e;
+@@
+- if (<+... x ...+>@e)
+-     {}
+- else
++ if (!(e))
+      {...}
+
+@@
+expression x, y, z;
+@@
+- x = of_get_mac_address(y, z);
++ of_get_mac_address(y, z);
+  ... when != x
+</spml>
+
+All drivers, except drivers/net/ethernet/aeroflex/greth.c, were
+compile-time tested.
+
+Suggested-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: Michael Walle <michael@walle.cc>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ arch/arm/mach-mvebu/kirkwood.c                     |  3 +-
+ arch/powerpc/sysdev/tsi108_dev.c                   |  5 +-
+ drivers/net/ethernet/aeroflex/greth.c              |  6 +--
+ drivers/net/ethernet/allwinner/sun4i-emac.c        | 10 ++--
+ drivers/net/ethernet/altera/altera_tse_main.c      |  7 +--
+ drivers/net/ethernet/arc/emac_main.c               |  8 +--
+ drivers/net/ethernet/atheros/ag71xx.c              |  7 +--
+ drivers/net/ethernet/broadcom/bcm4908_enet.c       |  7 +--
+ drivers/net/ethernet/broadcom/bcmsysport.c         |  7 +--
+ drivers/net/ethernet/broadcom/bgmac-bcma.c         | 10 ++--
+ drivers/net/ethernet/broadcom/bgmac-platform.c     | 11 ++--
+ drivers/net/ethernet/cadence/macb_main.c           | 11 ++--
+ drivers/net/ethernet/cavium/octeon/octeon_mgmt.c   |  8 +--
+ drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  5 +-
+ drivers/net/ethernet/davicom/dm9000.c              | 10 ++--
+ drivers/net/ethernet/ethoc.c                       |  6 +--
+ drivers/net/ethernet/ezchip/nps_enet.c             |  7 +--
+ drivers/net/ethernet/freescale/fec_main.c          |  7 +--
+ drivers/net/ethernet/freescale/fec_mpc52xx.c       |  7 +--
+ drivers/net/ethernet/freescale/fman/mac.c          |  9 ++--
+ .../net/ethernet/freescale/fs_enet/fs_enet-main.c  |  5 +-
+ drivers/net/ethernet/freescale/gianfar.c           |  8 +--
+ drivers/net/ethernet/freescale/ucc_geth.c          |  5 +-
+ drivers/net/ethernet/hisilicon/hisi_femac.c        |  7 +--
+ drivers/net/ethernet/hisilicon/hix5hd2_gmac.c      |  7 +--
+ drivers/net/ethernet/lantiq_xrx200.c               |  7 +--
+ drivers/net/ethernet/marvell/mv643xx_eth.c         |  5 +-
+ drivers/net/ethernet/marvell/mvneta.c              |  6 +--
+ .../net/ethernet/marvell/prestera/prestera_main.c  | 11 ++--
+ drivers/net/ethernet/marvell/pxa168_eth.c          |  9 +---
+ drivers/net/ethernet/marvell/sky2.c                |  8 ++-
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c        | 11 ++--
+ drivers/net/ethernet/micrel/ks8851_common.c        |  7 ++-
+ drivers/net/ethernet/microchip/lan743x_main.c      |  5 +-
+ drivers/net/ethernet/nxp/lpc_eth.c                 |  4 +-
+ drivers/net/ethernet/qualcomm/qca_spi.c            | 10 ++--
+ drivers/net/ethernet/qualcomm/qca_uart.c           |  9 +---
+ drivers/net/ethernet/renesas/ravb_main.c           | 12 +++--
+ drivers/net/ethernet/renesas/sh_eth.c              |  5 +-
+ .../net/ethernet/samsung/sxgbe/sxgbe_platform.c    | 13 ++---
+ drivers/net/ethernet/socionext/sni_ave.c           | 10 ++--
+ .../net/ethernet/stmicro/stmmac/dwmac-anarion.c    |  2 +-
+ .../ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c    |  2 +-
+ .../net/ethernet/stmicro/stmmac/dwmac-generic.c    |  2 +-
+ drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c    |  2 +-
+ .../net/ethernet/stmicro/stmmac/dwmac-intel-plat.c |  2 +-
+ .../net/ethernet/stmicro/stmmac/dwmac-ipq806x.c    |  2 +-
+ .../net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c    |  2 +-
+ .../net/ethernet/stmicro/stmmac/dwmac-mediatek.c   |  2 +-
+ drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c  |  2 +-
+ .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c    |  2 +-
+ drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c  |  2 +-
+ .../ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c    |  2 +-
+ drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c     |  2 +-
+ .../net/ethernet/stmicro/stmmac/dwmac-socfpga.c    |  2 +-
+ drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c    |  2 +-
+ drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c  |  2 +-
+ drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c  |  2 +-
+ drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c  |  2 +-
+ .../net/ethernet/stmicro/stmmac/dwmac-visconti.c   |  2 +-
+ drivers/net/ethernet/stmicro/stmmac/stmmac.h       |  2 +-
+ drivers/net/ethernet/stmicro/stmmac/stmmac_main.c  |  2 +-
+ .../net/ethernet/stmicro/stmmac/stmmac_platform.c  | 14 ++---
+ .../net/ethernet/stmicro/stmmac/stmmac_platform.h  |  2 +-
+ drivers/net/ethernet/ti/am65-cpsw-nuss.c           | 19 ++++---
+ drivers/net/ethernet/ti/cpsw.c                     |  7 +--
+ drivers/net/ethernet/ti/cpsw_new.c                 |  7 +--
+ drivers/net/ethernet/ti/davinci_emac.c             |  8 +--
+ drivers/net/ethernet/ti/netcp_core.c               |  7 +--
+ drivers/net/ethernet/wiznet/w5100-spi.c            |  8 ++-
+ drivers/net/ethernet/wiznet/w5100.c                |  2 +-
+ drivers/net/ethernet/xilinx/ll_temac_main.c        |  8 +--
+ drivers/net/ethernet/xilinx/xilinx_axienet_main.c  | 15 +++---
+ drivers/net/ethernet/xilinx/xilinx_emaclite.c      |  8 +--
+ drivers/net/wireless/ath/ath9k/init.c              |  5 +-
+ drivers/net/wireless/mediatek/mt76/eeprom.c        |  9 +---
+ drivers/net/wireless/ralink/rt2x00/rt2x00dev.c     |  6 +--
+ drivers/of/of_net.c                                | 60 ++++++++++------------
+ drivers/staging/octeon/ethernet.c                  | 10 ++--
+ drivers/staging/wfx/main.c                         |  7 ++-
+ include/linux/of_net.h                             |  6 +--
+ include/net/dsa.h                                  |  2 +-
+ net/dsa/dsa2.c                                     |  2 +-
+ net/dsa/slave.c                                    |  2 +-
+ net/ethernet/eth.c                                 | 11 ++--
+ 85 files changed, 218 insertions(+), 364 deletions(-)
+
+--- a/arch/arm/mach-mvebu/kirkwood.c
++++ b/arch/arm/mach-mvebu/kirkwood.c
+@@ -84,6 +84,7 @@ static void __init kirkwood_dt_eth_fixup
+               struct device_node *pnp = of_get_parent(np);
+               struct clk *clk;
+               struct property *pmac;
++              u8 tmpmac[ETH_ALEN];
+               void __iomem *io;
+               u8 *macaddr;
+               u32 reg;
+@@ -93,7 +94,7 @@ static void __init kirkwood_dt_eth_fixup
+               /* skip disabled nodes or nodes with valid MAC address*/
+               if (!of_device_is_available(pnp) ||
+-                  !IS_ERR(of_get_mac_address(np)))
++                  !of_get_mac_address(np, tmpmac))
+                       goto eth_fixup_skip;
+               clk = of_clk_get(pnp, 0);
+--- a/arch/powerpc/sysdev/tsi108_dev.c
++++ b/arch/powerpc/sysdev/tsi108_dev.c
+@@ -73,7 +73,6 @@ static int __init tsi108_eth_of_init(voi
+               struct device_node *phy, *mdio;
+               hw_info tsi_eth_data;
+               const unsigned int *phy_id;
+-              const void *mac_addr;
+               const phandle *ph;
+               memset(r, 0, sizeof(r));
+@@ -101,9 +100,7 @@ static int __init tsi108_eth_of_init(voi
+                       goto err;
+               }
+-              mac_addr = of_get_mac_address(np);
+-              if (!IS_ERR(mac_addr))
+-                      ether_addr_copy(tsi_eth_data.mac_addr, mac_addr);
++              of_get_mac_address(np, tsi_eth_data.mac_addr);
+               ph = of_get_property(np, "mdio-handle", NULL);
+               mdio = of_find_node_by_phandle(*ph);
+--- a/drivers/net/ethernet/aeroflex/greth.c
++++ b/drivers/net/ethernet/aeroflex/greth.c
+@@ -1450,10 +1450,10 @@ static int greth_of_probe(struct platfor
+                       break;
+       }
+       if (i == 6) {
+-              const u8 *addr;
++              u8 addr[ETH_ALEN];
+-              addr = of_get_mac_address(ofdev->dev.of_node);
+-              if (!IS_ERR(addr)) {
++              err = of_get_mac_address(ofdev->dev.of_node, addr);
++              if (!err) {
+                       for (i = 0; i < 6; i++)
+                               macaddr[i] = (unsigned int) addr[i];
+               } else {
+--- a/drivers/net/ethernet/allwinner/sun4i-emac.c
++++ b/drivers/net/ethernet/allwinner/sun4i-emac.c
+@@ -790,7 +790,6 @@ static int emac_probe(struct platform_de
+       struct emac_board_info *db;
+       struct net_device *ndev;
+       int ret = 0;
+-      const char *mac_addr;
+       ndev = alloc_etherdev(sizeof(struct emac_board_info));
+       if (!ndev) {
+@@ -853,12 +852,9 @@ static int emac_probe(struct platform_de
+       }
+       /* Read MAC-address from DT */
+-      mac_addr = of_get_mac_address(np);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(ndev->dev_addr, mac_addr);
+-
+-      /* Check if the MAC address is valid, if not get a random one */
+-      if (!is_valid_ether_addr(ndev->dev_addr)) {
++      ret = of_get_mac_address(np, ndev->dev_addr);
++      if (ret) {
++              /* if the MAC address is invalid get a random one */
+               eth_hw_addr_random(ndev);
+               dev_warn(&pdev->dev, "using random MAC address %pM\n",
+                        ndev->dev_addr);
+--- a/drivers/net/ethernet/altera/altera_tse_main.c
++++ b/drivers/net/ethernet/altera/altera_tse_main.c
+@@ -1355,7 +1355,6 @@ static int altera_tse_probe(struct platf
+       struct resource *control_port;
+       struct resource *dma_res;
+       struct altera_tse_private *priv;
+-      const unsigned char *macaddr;
+       void __iomem *descmap;
+       const struct of_device_id *of_id = NULL;
+@@ -1532,10 +1531,8 @@ static int altera_tse_probe(struct platf
+       priv->rx_dma_buf_sz = ALTERA_RXDMABUFFER_SIZE;
+       /* get default MAC address from device tree */
+-      macaddr = of_get_mac_address(pdev->dev.of_node);
+-      if (!IS_ERR(macaddr))
+-              ether_addr_copy(ndev->dev_addr, macaddr);
+-      else
++      ret = of_get_mac_address(pdev->dev.of_node, ndev->dev_addr);
++      if (ret)
+               eth_hw_addr_random(ndev);
+       /* get phy addr and create mdio */
+--- a/drivers/net/ethernet/arc/emac_main.c
++++ b/drivers/net/ethernet/arc/emac_main.c
+@@ -857,7 +857,6 @@ int arc_emac_probe(struct net_device *nd
+       struct device_node *phy_node;
+       struct phy_device *phydev = NULL;
+       struct arc_emac_priv *priv;
+-      const char *mac_addr;
+       unsigned int id, clock_frequency, irq;
+       int err;
+@@ -942,11 +941,8 @@ int arc_emac_probe(struct net_device *nd
+       }
+       /* Get MAC address from device tree */
+-      mac_addr = of_get_mac_address(dev->of_node);
+-
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(ndev->dev_addr, mac_addr);
+-      else
++      err = of_get_mac_address(dev->of_node, ndev->dev_addr);
++      if (err)
+               eth_hw_addr_random(ndev);
+       arc_emac_set_address_internal(ndev);
+--- a/drivers/net/ethernet/atheros/ag71xx.c
++++ b/drivers/net/ethernet/atheros/ag71xx.c
+@@ -1857,7 +1857,6 @@ static int ag71xx_probe(struct platform_
+       const struct ag71xx_dcfg *dcfg;
+       struct net_device *ndev;
+       struct resource *res;
+-      const void *mac_addr;
+       int tx_size, err, i;
+       struct ag71xx *ag;
+@@ -1953,10 +1952,8 @@ static int ag71xx_probe(struct platform_
+       ag->stop_desc->ctrl = 0;
+       ag->stop_desc->next = (u32)ag->stop_desc_dma;
+-      mac_addr = of_get_mac_address(np);
+-      if (!IS_ERR(mac_addr))
+-              memcpy(ndev->dev_addr, mac_addr, ETH_ALEN);
+-      if (IS_ERR(mac_addr) || !is_valid_ether_addr(ndev->dev_addr)) {
++      err = of_get_mac_address(np, ndev->dev_addr);
++      if (err) {
+               netif_err(ag, probe, ndev, "invalid MAC address, using random address\n");
+               eth_random_addr(ndev->dev_addr);
+       }
+--- a/drivers/net/ethernet/broadcom/bcmsysport.c
++++ b/drivers/net/ethernet/broadcom/bcmsysport.c
+@@ -2468,7 +2468,6 @@ static int bcm_sysport_probe(struct plat
+       struct bcm_sysport_priv *priv;
+       struct device_node *dn;
+       struct net_device *dev;
+-      const void *macaddr;
+       u32 txq, rxq;
+       int ret;
+@@ -2563,12 +2562,10 @@ static int bcm_sysport_probe(struct plat
+       }
+       /* Initialize netdevice members */
+-      macaddr = of_get_mac_address(dn);
+-      if (IS_ERR(macaddr)) {
++      ret = of_get_mac_address(dn, dev->dev_addr);
++      if (ret) {
+               dev_warn(&pdev->dev, "using random Ethernet MAC\n");
+               eth_hw_addr_random(dev);
+-      } else {
+-              ether_addr_copy(dev->dev_addr, macaddr);
+       }
+       SET_NETDEV_DEV(dev, &pdev->dev);
+--- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
++++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
+@@ -115,7 +115,7 @@ static int bgmac_probe(struct bcma_devic
+       struct ssb_sprom *sprom = &core->bus->sprom;
+       struct mii_bus *mii_bus;
+       struct bgmac *bgmac;
+-      const u8 *mac = NULL;
++      const u8 *mac;
+       int err;
+       bgmac = bgmac_alloc(&core->dev);
+@@ -128,11 +128,10 @@ static int bgmac_probe(struct bcma_devic
+       bcma_set_drvdata(core, bgmac);
+-      if (bgmac->dev->of_node)
+-              mac = of_get_mac_address(bgmac->dev->of_node);
++      err = of_get_mac_address(bgmac->dev->of_node, bgmac->net_dev->dev_addr);
+       /* If no MAC address assigned via device tree, check SPROM */
+-      if (IS_ERR_OR_NULL(mac)) {
++      if (err) {
+               switch (core->core_unit) {
+               case 0:
+                       mac = sprom->et0mac;
+@@ -149,10 +148,9 @@ static int bgmac_probe(struct bcma_devic
+                       err = -ENOTSUPP;
+                       goto err;
+               }
++              ether_addr_copy(bgmac->net_dev->dev_addr, mac);
+       }
+-      ether_addr_copy(bgmac->net_dev->dev_addr, mac);
+-
+       /* On BCM4706 we need common core to access PHY */
+       if (core->id.id == BCMA_CORE_4706_MAC_GBIT &&
+           !core->bus->drv_gmac_cmn.core) {
+--- a/drivers/net/ethernet/broadcom/bgmac-platform.c
++++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
+@@ -173,7 +173,7 @@ static int bgmac_probe(struct platform_d
+       struct device_node *np = pdev->dev.of_node;
+       struct bgmac *bgmac;
+       struct resource *regs;
+-      const u8 *mac_addr;
++      int ret;
+       bgmac = bgmac_alloc(&pdev->dev);
+       if (!bgmac)
+@@ -192,11 +192,10 @@ static int bgmac_probe(struct platform_d
+       bgmac->dev = &pdev->dev;
+       bgmac->dma_dev = &pdev->dev;
+-      mac_addr = of_get_mac_address(np);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(bgmac->net_dev->dev_addr, mac_addr);
+-      else
+-              dev_warn(&pdev->dev, "MAC address not present in device tree\n");
++      ret = of_get_mac_address(np, bgmac->net_dev->dev_addr);
++      if (ret)
++              dev_warn(&pdev->dev,
++                       "MAC address not present in device tree\n");
+       bgmac->irq = platform_get_irq(pdev, 0);
+       if (bgmac->irq < 0)
+--- a/drivers/net/ethernet/cadence/macb_main.c
++++ b/drivers/net/ethernet/cadence/macb_main.c
+@@ -4487,7 +4487,6 @@ static int macb_probe(struct platform_de
+       struct net_device *dev;
+       struct resource *regs;
+       void __iomem *mem;
+-      const char *mac;
+       struct macb *bp;
+       int err, val;
+@@ -4600,15 +4599,11 @@ static int macb_probe(struct platform_de
+       if (bp->caps & MACB_CAPS_NEEDS_RSTONUBR)
+               bp->rx_intr_mask |= MACB_BIT(RXUBR);
+-      mac = of_get_mac_address(np);
+-      if (PTR_ERR(mac) == -EPROBE_DEFER) {
+-              err = -EPROBE_DEFER;
++      err = of_get_mac_address(np, bp->dev->dev_addr);
++      if (err == -EPROBE_DEFER)
+               goto err_out_free_netdev;
+-      } else if (!IS_ERR_OR_NULL(mac)) {
+-              ether_addr_copy(bp->dev->dev_addr, mac);
+-      } else {
++      else if (err)
+               macb_get_hwaddr(bp);
+-      }
+       err = of_get_phy_mode(np, &interface);
+       if (err)
+--- a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
++++ b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
+@@ -1385,7 +1385,6 @@ static int octeon_mgmt_probe(struct plat
+       struct net_device *netdev;
+       struct octeon_mgmt *p;
+       const __be32 *data;
+-      const u8 *mac;
+       struct resource *res_mix;
+       struct resource *res_agl;
+       struct resource *res_agl_prt_ctl;
+@@ -1502,11 +1501,8 @@ static int octeon_mgmt_probe(struct plat
+       netdev->min_mtu = 64 - OCTEON_MGMT_RX_HEADROOM;
+       netdev->max_mtu = 16383 - OCTEON_MGMT_RX_HEADROOM - VLAN_HLEN;
+-      mac = of_get_mac_address(pdev->dev.of_node);
+-
+-      if (!IS_ERR(mac))
+-              ether_addr_copy(netdev->dev_addr, mac);
+-      else
++      result = of_get_mac_address(pdev->dev.of_node, netdev->dev_addr);
++      if (result)
+               eth_hw_addr_random(netdev);
+       p->phy_np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0);
+--- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
++++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
+@@ -1476,7 +1476,6 @@ static int bgx_init_of_phy(struct bgx *b
+       device_for_each_child_node(&bgx->pdev->dev, fwn) {
+               struct phy_device *pd;
+               struct device_node *phy_np;
+-              const char *mac;
+               /* Should always be an OF node.  But if it is not, we
+                * cannot handle it, so exit the loop.
+@@ -1485,9 +1484,7 @@ static int bgx_init_of_phy(struct bgx *b
+               if (!node)
+                       break;
+-              mac = of_get_mac_address(node);
+-              if (!IS_ERR(mac))
+-                      ether_addr_copy(bgx->lmac[lmac].mac, mac);
++              of_get_mac_address(node, bgx->lmac[lmac].mac);
+               SET_NETDEV_DEV(&bgx->lmac[lmac].netdev, &bgx->pdev->dev);
+               bgx->lmac[lmac].lmacid = lmac;
+--- a/drivers/net/ethernet/davicom/dm9000.c
++++ b/drivers/net/ethernet/davicom/dm9000.c
+@@ -1388,7 +1388,7 @@ static struct dm9000_plat_data *dm9000_p
+ {
+       struct dm9000_plat_data *pdata;
+       struct device_node *np = dev->of_node;
+-      const void *mac_addr;
++      int ret;
+       if (!IS_ENABLED(CONFIG_OF) || !np)
+               return ERR_PTR(-ENXIO);
+@@ -1402,11 +1402,9 @@ static struct dm9000_plat_data *dm9000_p
+       if (of_find_property(np, "davicom,no-eeprom", NULL))
+               pdata->flags |= DM9000_PLATF_NO_EEPROM;
+-      mac_addr = of_get_mac_address(np);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(pdata->dev_addr, mac_addr);
+-      else if (PTR_ERR(mac_addr) == -EPROBE_DEFER)
+-              return ERR_CAST(mac_addr);
++      ret = of_get_mac_address(np, pdata->dev_addr);
++      if (ret == -EPROBE_DEFER)
++              return ERR_PTR(ret);
+       return pdata;
+ }
+--- a/drivers/net/ethernet/ethoc.c
++++ b/drivers/net/ethernet/ethoc.c
+@@ -1151,11 +1151,7 @@ static int ethoc_probe(struct platform_d
+               ether_addr_copy(netdev->dev_addr, pdata->hwaddr);
+               priv->phy_id = pdata->phy_id;
+       } else {
+-              const void *mac;
+-
+-              mac = of_get_mac_address(pdev->dev.of_node);
+-              if (!IS_ERR(mac))
+-                      ether_addr_copy(netdev->dev_addr, mac);
++              of_get_mac_address(pdev->dev.of_node, netdev->dev_addr);
+               priv->phy_id = -1;
+       }
+--- a/drivers/net/ethernet/ezchip/nps_enet.c
++++ b/drivers/net/ethernet/ezchip/nps_enet.c
+@@ -575,7 +575,6 @@ static s32 nps_enet_probe(struct platfor
+       struct net_device *ndev;
+       struct nps_enet_priv *priv;
+       s32 err = 0;
+-      const char *mac_addr;
+       if (!dev->of_node)
+               return -ENODEV;
+@@ -602,10 +601,8 @@ static s32 nps_enet_probe(struct platfor
+       dev_dbg(dev, "Registers base address is 0x%p\n", priv->regs_base);
+       /* set kernel MAC address to dev */
+-      mac_addr = of_get_mac_address(dev->of_node);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(ndev->dev_addr, mac_addr);
+-      else
++      err = of_get_mac_address(dev->of_node, ndev->dev_addr);
++      if (err)
+               eth_hw_addr_random(ndev);
+       /* Get IRQ number */
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -1666,6 +1666,7 @@ static void fec_get_mac(struct net_devic
+       struct fec_enet_private *fep = netdev_priv(ndev);
+       struct fec_platform_data *pdata = dev_get_platdata(&fep->pdev->dev);
+       unsigned char *iap, tmpaddr[ETH_ALEN];
++      int ret;
+       /*
+        * try to get mac address in following order:
+@@ -1681,9 +1682,9 @@ static void fec_get_mac(struct net_devic
+       if (!is_valid_ether_addr(iap)) {
+               struct device_node *np = fep->pdev->dev.of_node;
+               if (np) {
+-                      const char *mac = of_get_mac_address(np);
+-                      if (!IS_ERR(mac))
+-                              iap = (unsigned char *) mac;
++                      ret = of_get_mac_address(np, tmpaddr);
++                      if (!ret)
++                              iap = tmpaddr;
+               }
+       }
+--- a/drivers/net/ethernet/freescale/fec_mpc52xx.c
++++ b/drivers/net/ethernet/freescale/fec_mpc52xx.c
+@@ -813,7 +813,6 @@ static int mpc52xx_fec_probe(struct plat
+       const u32 *prop;
+       int prop_size;
+       struct device_node *np = op->dev.of_node;
+-      const char *mac_addr;
+       phys_addr_t rx_fifo;
+       phys_addr_t tx_fifo;
+@@ -891,10 +890,8 @@ static int mpc52xx_fec_probe(struct plat
+        *
+        * First try to read MAC address from DT
+        */
+-      mac_addr = of_get_mac_address(np);
+-      if (!IS_ERR(mac_addr)) {
+-              ether_addr_copy(ndev->dev_addr, mac_addr);
+-      } else {
++      rv = of_get_mac_address(np, ndev->dev_addr);
++      if (rv) {
+               struct mpc52xx_fec __iomem *fec = priv->fec;
+               /*
+--- a/drivers/net/ethernet/freescale/fman/mac.c
++++ b/drivers/net/ethernet/freescale/fman/mac.c
+@@ -616,7 +616,6 @@ static int mac_probe(struct platform_dev
+       struct platform_device  *of_dev;
+       struct resource          res;
+       struct mac_priv_s       *priv;
+-      const u8                *mac_addr;
+       u32                      val;
+       u8                      fman_id;
+       phy_interface_t          phy_if;
+@@ -734,11 +733,9 @@ static int mac_probe(struct platform_dev
+       priv->cell_index = (u8)val;
+       /* Get the MAC address */
+-      mac_addr = of_get_mac_address(mac_node);
+-      if (IS_ERR(mac_addr))
++      err = of_get_mac_address(mac_node, mac_dev->addr);
++      if (err)
+               dev_warn(dev, "of_get_mac_address(%pOF) failed\n", mac_node);
+-      else
+-              ether_addr_copy(mac_dev->addr, mac_addr);
+       /* Get the port handles */
+       nph = of_count_phandle_with_args(mac_node, "fsl,fman-ports", NULL);
+@@ -864,7 +861,7 @@ static int mac_probe(struct platform_dev
+       if (err < 0)
+               dev_err(dev, "fman_set_mac_active_pause() = %d\n", err);
+-      if (!IS_ERR(mac_addr))
++      if (!is_zero_ether_addr(mac_dev->addr))
+               dev_info(dev, "FMan MAC address: %pM\n", mac_dev->addr);
+       priv->eth_dev = dpaa_eth_add_device(fman_id, mac_dev);
+--- a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
++++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
+@@ -918,7 +918,6 @@ static int fs_enet_probe(struct platform
+       const u32 *data;
+       struct clk *clk;
+       int err;
+-      const u8 *mac_addr;
+       const char *phy_connection_type;
+       int privsize, len, ret = -ENODEV;
+@@ -1006,9 +1005,7 @@ static int fs_enet_probe(struct platform
+       spin_lock_init(&fep->lock);
+       spin_lock_init(&fep->tx_lock);
+-      mac_addr = of_get_mac_address(ofdev->dev.of_node);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(ndev->dev_addr, mac_addr);
++      of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr);
+       ret = fep->ops->allocate_bd(ndev);
+       if (ret)
+--- a/drivers/net/ethernet/freescale/gianfar.c
++++ b/drivers/net/ethernet/freescale/gianfar.c
+@@ -641,7 +641,6 @@ static phy_interface_t gfar_get_interfac
+ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
+ {
+       const char *model;
+-      const void *mac_addr;
+       int err = 0, i;
+       phy_interface_t interface;
+       struct net_device *dev = NULL;
+@@ -783,11 +782,8 @@ static int gfar_of_init(struct platform_
+       if (stash_len || stash_idx)
+               priv->device_flags |= FSL_GIANFAR_DEV_HAS_BUF_STASHING;
+-      mac_addr = of_get_mac_address(np);
+-
+-      if (!IS_ERR(mac_addr)) {
+-              ether_addr_copy(dev->dev_addr, mac_addr);
+-      } else {
++      err = of_get_mac_address(np, dev->dev_addr);
++      if (err) {
+               eth_hw_addr_random(dev);
+               dev_info(&ofdev->dev, "Using random MAC address: %pM\n", dev->dev_addr);
+       }
+--- a/drivers/net/ethernet/freescale/ucc_geth.c
++++ b/drivers/net/ethernet/freescale/ucc_geth.c
+@@ -3696,7 +3696,6 @@ static int ucc_geth_probe(struct platfor
+       int err, ucc_num, max_speed = 0;
+       const unsigned int *prop;
+       const char *sprop;
+-      const void *mac_addr;
+       phy_interface_t phy_interface;
+       static const int enet_to_speed[] = {
+               SPEED_10, SPEED_10, SPEED_10,
+@@ -3906,9 +3905,7 @@ static int ucc_geth_probe(struct platfor
+               goto err_free_netdev;
+       }
+-      mac_addr = of_get_mac_address(np);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(dev->dev_addr, mac_addr);
++      of_get_mac_address(np, dev->dev_addr);
+       ugeth->ug_info = ug_info;
+       ugeth->dev = device;
+--- a/drivers/net/ethernet/hisilicon/hisi_femac.c
++++ b/drivers/net/ethernet/hisilicon/hisi_femac.c
+@@ -772,7 +772,6 @@ static int hisi_femac_drv_probe(struct p
+       struct net_device *ndev;
+       struct hisi_femac_priv *priv;
+       struct phy_device *phy;
+-      const char *mac_addr;
+       int ret;
+       ndev = alloc_etherdev(sizeof(*priv));
+@@ -842,10 +841,8 @@ static int hisi_femac_drv_probe(struct p
+                          (unsigned long)phy->phy_id,
+                          phy_modes(phy->interface));
+-      mac_addr = of_get_mac_address(node);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(ndev->dev_addr, mac_addr);
+-      if (!is_valid_ether_addr(ndev->dev_addr)) {
++      ret = of_get_mac_address(node, ndev->dev_addr);
++      if (ret) {
+               eth_hw_addr_random(ndev);
+               dev_warn(dev, "using random MAC address %pM\n",
+                        ndev->dev_addr);
+--- a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c
++++ b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c
+@@ -1098,7 +1098,6 @@ static int hix5hd2_dev_probe(struct plat
+       struct net_device *ndev;
+       struct hix5hd2_priv *priv;
+       struct mii_bus *bus;
+-      const char *mac_addr;
+       int ret;
+       ndev = alloc_etherdev(sizeof(struct hix5hd2_priv));
+@@ -1220,10 +1219,8 @@ static int hix5hd2_dev_probe(struct plat
+               goto out_phy_node;
+       }
+-      mac_addr = of_get_mac_address(node);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(ndev->dev_addr, mac_addr);
+-      if (!is_valid_ether_addr(ndev->dev_addr)) {
++      ret = of_get_mac_address(node, ndev->dev_addr);
++      if (ret) {
+               eth_hw_addr_random(ndev);
+               netdev_warn(ndev, "using random MAC address %pM\n",
+                           ndev->dev_addr);
+--- a/drivers/net/ethernet/lantiq_xrx200.c
++++ b/drivers/net/ethernet/lantiq_xrx200.c
+@@ -440,7 +440,6 @@ static int xrx200_probe(struct platform_
+       struct resource *res;
+       struct xrx200_priv *priv;
+       struct net_device *net_dev;
+-      const u8 *mac;
+       int err;
+       /* alloc the network device */
+@@ -484,10 +483,8 @@ static int xrx200_probe(struct platform_
+               return PTR_ERR(priv->clk);
+       }
+-      mac = of_get_mac_address(np);
+-      if (!IS_ERR(mac))
+-              ether_addr_copy(net_dev->dev_addr, mac);
+-      else
++      err = of_get_mac_address(np, net_dev->dev_addr);
++      if (err)
+               eth_hw_addr_random(net_dev);
+       /* bring up the dma engine and IP core */
+--- a/drivers/net/ethernet/marvell/mv643xx_eth.c
++++ b/drivers/net/ethernet/marvell/mv643xx_eth.c
+@@ -2701,7 +2701,6 @@ static int mv643xx_eth_shared_of_add_por
+       struct platform_device *ppdev;
+       struct mv643xx_eth_platform_data ppd;
+       struct resource res;
+-      const char *mac_addr;
+       int ret;
+       int dev_num = 0;
+@@ -2732,9 +2731,7 @@ static int mv643xx_eth_shared_of_add_por
+               return -EINVAL;
+       }
+-      mac_addr = of_get_mac_address(pnp);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(ppd.mac_addr, mac_addr);
++      of_get_mac_address(pnp, ppd.mac_addr);
+       mv643xx_eth_property(pnp, "tx-queue-size", ppd.tx_queue_size);
+       mv643xx_eth_property(pnp, "tx-sram-addr", ppd.tx_sram_addr);
+--- a/drivers/net/ethernet/marvell/mvneta.c
++++ b/drivers/net/ethernet/marvell/mvneta.c
+@@ -5062,7 +5062,6 @@ static int mvneta_probe(struct platform_
+       struct net_device *dev;
+       struct phylink *phylink;
+       struct phy *comphy;
+-      const char *dt_mac_addr;
+       char hw_mac_addr[ETH_ALEN];
+       phy_interface_t phy_mode;
+       const char *mac_from;
+@@ -5158,10 +5157,9 @@ static int mvneta_probe(struct platform_
+               goto err_free_ports;
+       }
+-      dt_mac_addr = of_get_mac_address(dn);
+-      if (!IS_ERR(dt_mac_addr)) {
++      err = of_get_mac_address(dn, dev->dev_addr);
++      if (!err) {
+               mac_from = "device tree";
+-              ether_addr_copy(dev->dev_addr, dt_mac_addr);
+       } else {
+               mvneta_get_mac_addr(pp, hw_mac_addr);
+               if (is_valid_ether_addr(hw_mac_addr)) {
+--- a/drivers/net/ethernet/marvell/prestera/prestera_main.c
++++ b/drivers/net/ethernet/marvell/prestera/prestera_main.c
+@@ -466,20 +466,17 @@ static int prestera_switch_set_base_mac_
+ {
+       struct device_node *base_mac_np;
+       struct device_node *np;
+-      const char *base_mac;
++      int ret;
+       np = of_find_compatible_node(NULL, NULL, "marvell,prestera");
+       base_mac_np = of_parse_phandle(np, "base-mac-provider", 0);
+-      base_mac = of_get_mac_address(base_mac_np);
+-      of_node_put(base_mac_np);
+-      if (!IS_ERR(base_mac))
+-              ether_addr_copy(sw->base_mac, base_mac);
+-
+-      if (!is_valid_ether_addr(sw->base_mac)) {
++      ret = of_get_mac_address(base_mac_np, sw->base_mac);
++      if (ret) {
+               eth_random_addr(sw->base_mac);
+               dev_info(prestera_dev(sw), "using random base mac address\n");
+       }
++      of_node_put(base_mac_np);
+       return prestera_hw_switch_mac_set(sw, sw->base_mac);
+ }
+--- a/drivers/net/ethernet/marvell/pxa168_eth.c
++++ b/drivers/net/ethernet/marvell/pxa168_eth.c
+@@ -1392,7 +1392,6 @@ static int pxa168_eth_probe(struct platf
+       struct resource *res;
+       struct clk *clk;
+       struct device_node *np;
+-      const unsigned char *mac_addr = NULL;
+       int err;
+       printk(KERN_NOTICE "PXA168 10/100 Ethernet Driver\n");
+@@ -1435,12 +1434,8 @@ static int pxa168_eth_probe(struct platf
+       INIT_WORK(&pep->tx_timeout_task, pxa168_eth_tx_timeout_task);
+-      if (pdev->dev.of_node)
+-              mac_addr = of_get_mac_address(pdev->dev.of_node);
+-
+-      if (!IS_ERR_OR_NULL(mac_addr)) {
+-              ether_addr_copy(dev->dev_addr, mac_addr);
+-      } else {
++      err = of_get_mac_address(pdev->dev.of_node, dev->dev_addr);
++      if (err) {
+               /* try reading the mac address, if set by the bootloader */
+               pxa168_eth_get_mac_address(dev, dev->dev_addr);
+               if (!is_valid_ether_addr(dev->dev_addr)) {
+--- a/drivers/net/ethernet/marvell/sky2.c
++++ b/drivers/net/ethernet/marvell/sky2.c
+@@ -4725,7 +4725,7 @@ static struct net_device *sky2_init_netd
+ {
+       struct sky2_port *sky2;
+       struct net_device *dev = alloc_etherdev(sizeof(*sky2));
+-      const void *iap;
++      int ret;
+       if (!dev)
+               return NULL;
+@@ -4795,10 +4795,8 @@ static struct net_device *sky2_init_netd
+        * 1) from device tree data
+        * 2) from internal registers set by bootloader
+        */
+-      iap = of_get_mac_address(hw->pdev->dev.of_node);
+-      if (!IS_ERR(iap))
+-              ether_addr_copy(dev->dev_addr, iap);
+-      else
++      ret = of_get_mac_address(hw->pdev->dev.of_node, dev->dev_addr);
++      if (ret)
+               memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8,
+                             ETH_ALEN);
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -2604,14 +2604,11 @@ static int __init mtk_init(struct net_de
+ {
+       struct mtk_mac *mac = netdev_priv(dev);
+       struct mtk_eth *eth = mac->hw;
+-      const char *mac_addr;
++      int ret;
+-      mac_addr = of_get_mac_address(mac->of_node);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(dev->dev_addr, mac_addr);
+-
+-      /* If the mac address is invalid, use random mac address  */
+-      if (!is_valid_ether_addr(dev->dev_addr)) {
++      ret = of_get_mac_address(mac->of_node, dev->dev_addr);
++      if (ret) {
++              /* If the mac address is invalid, use random mac address */
+               eth_hw_addr_random(dev);
+               dev_err(eth->dev, "generated random MAC address %pM\n",
+                       dev->dev_addr);
+--- a/drivers/net/ethernet/micrel/ks8851_common.c
++++ b/drivers/net/ethernet/micrel/ks8851_common.c
+@@ -194,11 +194,10 @@ static void ks8851_read_mac_addr(struct
+ static void ks8851_init_mac(struct ks8851_net *ks, struct device_node *np)
+ {
+       struct net_device *dev = ks->netdev;
+-      const u8 *mac_addr;
++      int ret;
+-      mac_addr = of_get_mac_address(np);
+-      if (!IS_ERR(mac_addr)) {
+-              ether_addr_copy(dev->dev_addr, mac_addr);
++      ret = of_get_mac_address(np, dev->dev_addr);
++      if (!ret) {
+               ks8851_write_mac_addr(dev);
+               return;
+       }
+--- a/drivers/net/ethernet/microchip/lan743x_main.c
++++ b/drivers/net/ethernet/microchip/lan743x_main.c
+@@ -2831,7 +2831,6 @@ static int lan743x_pcidev_probe(struct p
+ {
+       struct lan743x_adapter *adapter = NULL;
+       struct net_device *netdev = NULL;
+-      const void *mac_addr;
+       int ret = -ENODEV;
+       netdev = devm_alloc_etherdev(&pdev->dev,
+@@ -2848,9 +2847,7 @@ static int lan743x_pcidev_probe(struct p
+                             NETIF_MSG_IFDOWN | NETIF_MSG_TX_QUEUED;
+       netdev->max_mtu = LAN743X_MAX_FRAME_SIZE;
+-      mac_addr = of_get_mac_address(pdev->dev.of_node);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(adapter->mac_address, mac_addr);
++      of_get_mac_address(pdev->dev.of_node, adapter->mac_address);
+       ret = lan743x_pci_init(adapter, pdev);
+       if (ret)
+--- a/drivers/net/ethernet/nxp/lpc_eth.c
++++ b/drivers/net/ethernet/nxp/lpc_eth.c
+@@ -1347,9 +1347,7 @@ static int lpc_eth_drv_probe(struct plat
+       __lpc_get_mac(pldat, ndev->dev_addr);
+       if (!is_valid_ether_addr(ndev->dev_addr)) {
+-              const char *macaddr = of_get_mac_address(np);
+-              if (!IS_ERR(macaddr))
+-                      ether_addr_copy(ndev->dev_addr, macaddr);
++              of_get_mac_address(np, ndev->dev_addr);
+       }
+       if (!is_valid_ether_addr(ndev->dev_addr))
+               eth_hw_addr_random(ndev);
+--- a/drivers/net/ethernet/qualcomm/qca_spi.c
++++ b/drivers/net/ethernet/qualcomm/qca_spi.c
+@@ -885,7 +885,7 @@ qca_spi_probe(struct spi_device *spi)
+       struct net_device *qcaspi_devs = NULL;
+       u8 legacy_mode = 0;
+       u16 signature;
+-      const char *mac;
++      int ret;
+       if (!spi->dev.of_node) {
+               dev_err(&spi->dev, "Missing device tree\n");
+@@ -962,12 +962,8 @@ qca_spi_probe(struct spi_device *spi)
+       spi_set_drvdata(spi, qcaspi_devs);
+-      mac = of_get_mac_address(spi->dev.of_node);
+-
+-      if (!IS_ERR(mac))
+-              ether_addr_copy(qca->net_dev->dev_addr, mac);
+-
+-      if (!is_valid_ether_addr(qca->net_dev->dev_addr)) {
++      ret = of_get_mac_address(spi->dev.of_node, qca->net_dev->dev_addr);
++      if (ret) {
+               eth_hw_addr_random(qca->net_dev);
+               dev_info(&spi->dev, "Using random MAC address: %pM\n",
+                        qca->net_dev->dev_addr);
+--- a/drivers/net/ethernet/qualcomm/qca_uart.c
++++ b/drivers/net/ethernet/qualcomm/qca_uart.c
+@@ -323,7 +323,6 @@ static int qca_uart_probe(struct serdev_
+ {
+       struct net_device *qcauart_dev = alloc_etherdev(sizeof(struct qcauart));
+       struct qcauart *qca;
+-      const char *mac;
+       u32 speed = 115200;
+       int ret;
+@@ -348,12 +347,8 @@ static int qca_uart_probe(struct serdev_
+       of_property_read_u32(serdev->dev.of_node, "current-speed", &speed);
+-      mac = of_get_mac_address(serdev->dev.of_node);
+-
+-      if (!IS_ERR(mac))
+-              ether_addr_copy(qca->net_dev->dev_addr, mac);
+-
+-      if (!is_valid_ether_addr(qca->net_dev->dev_addr)) {
++      ret = of_get_mac_address(serdev->dev.of_node, qca->net_dev->dev_addr);
++      if (ret) {
+               eth_hw_addr_random(qca->net_dev);
+               dev_info(&serdev->dev, "Using random MAC address: %pM\n",
+                        qca->net_dev->dev_addr);
+--- a/drivers/net/ethernet/renesas/ravb_main.c
++++ b/drivers/net/ethernet/renesas/ravb_main.c
+@@ -109,11 +109,13 @@ static void ravb_set_buffer_align(struct
+  * Ethernet AVB device doesn't have ROM for MAC address.
+  * This function gets the MAC address that was used by a bootloader.
+  */
+-static void ravb_read_mac_address(struct net_device *ndev, const u8 *mac)
++static void ravb_read_mac_address(struct device_node *np,
++                                struct net_device *ndev)
+ {
+-      if (!IS_ERR(mac)) {
+-              ether_addr_copy(ndev->dev_addr, mac);
+-      } else {
++      int ret;
++
++      ret = of_get_mac_address(np, ndev->dev_addr);
++      if (ret) {
+               u32 mahr = ravb_read(ndev, MAHR);
+               u32 malr = ravb_read(ndev, MALR);
+@@ -2189,7 +2191,7 @@ static int ravb_probe(struct platform_de
+       priv->msg_enable = RAVB_DEF_MSG_ENABLE;
+       /* Read and set MAC address */
+-      ravb_read_mac_address(ndev, of_get_mac_address(np));
++      ravb_read_mac_address(np, ndev);
+       if (!is_valid_ether_addr(ndev->dev_addr)) {
+               dev_warn(&pdev->dev,
+                        "no valid MAC address supplied, using a random one\n");
+--- a/drivers/net/ethernet/renesas/sh_eth.c
++++ b/drivers/net/ethernet/renesas/sh_eth.c
+@@ -3145,7 +3145,6 @@ static struct sh_eth_plat_data *sh_eth_p
+       struct device_node *np = dev->of_node;
+       struct sh_eth_plat_data *pdata;
+       phy_interface_t interface;
+-      const char *mac_addr;
+       int ret;
+       pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+@@ -3157,9 +3156,7 @@ static struct sh_eth_plat_data *sh_eth_p
+               return NULL;
+       pdata->phy_interface = interface;
+-      mac_addr = of_get_mac_address(np);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(pdata->mac_addr, mac_addr);
++      of_get_mac_address(np, pdata->mac_addr);
+       pdata->no_ether_link =
+               of_property_read_bool(np, "renesas,no-ether-link");
+--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
++++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
+@@ -25,8 +25,7 @@
+ #ifdef CONFIG_OF
+ static int sxgbe_probe_config_dt(struct platform_device *pdev,
+-                               struct sxgbe_plat_data *plat,
+-                               const char **mac)
++                               struct sxgbe_plat_data *plat)
+ {
+       struct device_node *np = pdev->dev.of_node;
+       struct sxgbe_dma_cfg *dma_cfg;
+@@ -35,7 +34,6 @@ static int sxgbe_probe_config_dt(struct
+       if (!np)
+               return -ENODEV;
+-      *mac = of_get_mac_address(np);
+       err = of_get_phy_mode(np, &plat->interface);
+       if (err && err != -ENODEV)
+               return err;
+@@ -63,8 +61,7 @@ static int sxgbe_probe_config_dt(struct
+ }
+ #else
+ static int sxgbe_probe_config_dt(struct platform_device *pdev,
+-                               struct sxgbe_plat_data *plat,
+-                               const char **mac)
++                               struct sxgbe_plat_data *plat)
+ {
+       return -ENOSYS;
+ }
+@@ -85,7 +82,6 @@ static int sxgbe_platform_probe(struct p
+       void __iomem *addr;
+       struct sxgbe_priv_data *priv = NULL;
+       struct sxgbe_plat_data *plat_dat = NULL;
+-      const char *mac = NULL;
+       struct net_device *ndev = platform_get_drvdata(pdev);
+       struct device_node *node = dev->of_node;
+@@ -101,7 +97,7 @@ static int sxgbe_platform_probe(struct p
+               if (!plat_dat)
+                       return  -ENOMEM;
+-              ret = sxgbe_probe_config_dt(pdev, plat_dat, &mac);
++              ret = sxgbe_probe_config_dt(pdev, plat_dat);
+               if (ret) {
+                       pr_err("%s: main dt probe failed\n", __func__);
+                       return ret;
+@@ -122,8 +118,7 @@ static int sxgbe_platform_probe(struct p
+       }
+       /* Get MAC address if available (DT) */
+-      if (!IS_ERR_OR_NULL(mac))
+-              ether_addr_copy(priv->dev->dev_addr, mac);
++      of_get_mac_address(node, priv->dev->dev_addr);
+       /* Get the TX/RX IRQ numbers */
+       for (i = 0, chan = 1; i < SXGBE_TX_QUEUES; i++) {
+--- a/drivers/net/ethernet/socionext/sni_ave.c
++++ b/drivers/net/ethernet/socionext/sni_ave.c
+@@ -1559,7 +1559,6 @@ static int ave_probe(struct platform_dev
+       struct ave_private *priv;
+       struct net_device *ndev;
+       struct device_node *np;
+-      const void *mac_addr;
+       void __iomem *base;
+       const char *name;
+       int i, irq, ret;
+@@ -1600,12 +1599,9 @@ static int ave_probe(struct platform_dev
+       ndev->max_mtu = AVE_MAX_ETHFRAME - (ETH_HLEN + ETH_FCS_LEN);
+-      mac_addr = of_get_mac_address(np);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(ndev->dev_addr, mac_addr);
+-
+-      /* if the mac address is invalid, use random mac address */
+-      if (!is_valid_ether_addr(ndev->dev_addr)) {
++      ret = of_get_mac_address(np, ndev->dev_addr);
++      if (ret) {
++              /* if the mac address is invalid, use random mac address */
+               eth_hw_addr_random(ndev);
+               dev_warn(dev, "Using random MAC address: %pM\n",
+                        ndev->dev_addr);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c
+@@ -115,7 +115,7 @@ static int anarion_dwmac_probe(struct pl
+       if (IS_ERR(gmac))
+               return PTR_ERR(gmac);
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
+@@ -445,7 +445,7 @@ static int dwc_eth_dwmac_probe(struct pl
+       if (IS_ERR(stmmac_res.addr))
+               return PTR_ERR(stmmac_res.addr);
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
+@@ -27,7 +27,7 @@ static int dwmac_generic_probe(struct pl
+               return ret;
+       if (pdev->dev.of_node) {
+-              plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++              plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+               if (IS_ERR(plat_dat)) {
+                       dev_err(&pdev->dev, "dt configuration failed\n");
+                       return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c
+@@ -226,7 +226,7 @@ static int imx_dwmac_probe(struct platfo
+       if (!dwmac)
+               return -ENOMEM;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-intel-plat.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-intel-plat.c
+@@ -88,7 +88,7 @@ static int intel_eth_plat_probe(struct p
+       if (ret)
+               return ret;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat)) {
+               dev_err(&pdev->dev, "dt configuration failed\n");
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
+@@ -255,7 +255,7 @@ static int ipq806x_gmac_probe(struct pla
+       if (val)
+               return val;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c
+@@ -37,7 +37,7 @@ static int lpc18xx_dwmac_probe(struct pl
+       if (ret)
+               return ret;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c
+@@ -407,7 +407,7 @@ static int mediatek_dwmac_probe(struct p
+       if (ret)
+               return ret;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c
+@@ -52,7 +52,7 @@ static int meson6_dwmac_probe(struct pla
+       if (ret)
+               return ret;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
+@@ -370,7 +370,7 @@ static int meson8b_dwmac_probe(struct pl
+       if (ret)
+               return ret;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c
+@@ -118,7 +118,7 @@ static int oxnas_dwmac_probe(struct plat
+       if (ret)
+               return ret;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
+@@ -461,7 +461,7 @@ static int qcom_ethqos_probe(struct plat
+       if (ret)
+               return ret;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat)) {
+               dev_err(&pdev->dev, "dt configuration failed\n");
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+@@ -1392,7 +1392,7 @@ static int rk_gmac_probe(struct platform
+       if (ret)
+               return ret;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
+@@ -397,7 +397,7 @@ static int socfpga_dwmac_probe(struct pl
+       if (ret)
+               return ret;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
+@@ -325,7 +325,7 @@ static int sti_dwmac_probe(struct platfo
+       if (ret)
+               return ret;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
+@@ -371,7 +371,7 @@ static int stm32_dwmac_probe(struct plat
+       if (ret)
+               return ret;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
+@@ -1203,7 +1203,7 @@ static int sun8i_dwmac_probe(struct plat
+       if (ret)
+               return -EINVAL;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
+@@ -108,7 +108,7 @@ static int sun7i_gmac_probe(struct platf
+       if (ret)
+               return ret;
+-      plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
++      plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
+       if (IS_ERR(plat_dat))
+               return PTR_ERR(plat_dat);
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
+@@ -25,7 +25,7 @@
+ struct stmmac_resources {
+       void __iomem *addr;
+-      const char *mac;
++      u8 mac[ETH_ALEN];
+       int wol_irq;
+       int lpi_irq;
+       int irq;
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+@@ -5008,7 +5008,7 @@ int stmmac_dvr_probe(struct device *devi
+       priv->wol_irq = res->wol_irq;
+       priv->lpi_irq = res->lpi_irq;
+-      if (!IS_ERR_OR_NULL(res->mac))
++      if (!is_zero_ether_addr(res->mac))
+               memcpy(priv->dev->dev_addr, res->mac, ETH_ALEN);
+       dev_set_drvdata(device, priv->dev);
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
+@@ -395,7 +395,7 @@ static int stmmac_of_get_mac_mode(struct
+  * set some private fields that will be used by the main at runtime.
+  */
+ struct plat_stmmacenet_data *
+-stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
++stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
+ {
+       struct device_node *np = pdev->dev.of_node;
+       struct plat_stmmacenet_data *plat;
+@@ -407,12 +407,12 @@ stmmac_probe_config_dt(struct platform_d
+       if (!plat)
+               return ERR_PTR(-ENOMEM);
+-      *mac = of_get_mac_address(np);
+-      if (IS_ERR(*mac)) {
+-              if (PTR_ERR(*mac) == -EPROBE_DEFER)
+-                      return ERR_CAST(*mac);
++      rc = of_get_mac_address(np, mac);
++      if (rc) {
++              if (rc == -EPROBE_DEFER)
++                      return ERR_PTR(rc);
+-              *mac = NULL;
++              eth_zero_addr(mac);
+       }
+       phy_mode = device_get_phy_mode(&pdev->dev);
+@@ -643,7 +643,7 @@ void stmmac_remove_config_dt(struct plat
+ }
+ #else
+ struct plat_stmmacenet_data *
+-stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
++stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
+ {
+       return ERR_PTR(-EINVAL);
+ }
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h
+@@ -12,7 +12,7 @@
+ #include "stmmac.h"
+ struct plat_stmmacenet_data *
+-stmmac_probe_config_dt(struct platform_device *pdev, const char **mac);
++stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac);
+ void stmmac_remove_config_dt(struct platform_device *pdev,
+                            struct plat_stmmacenet_data *plat);
+--- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c
++++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
+@@ -1742,7 +1742,6 @@ static int am65_cpsw_nuss_init_slave_por
+       for_each_child_of_node(node, port_np) {
+               struct am65_cpsw_port *port;
+-              const void *mac_addr;
+               u32 port_id;
+               /* it is not a slave port node, continue */
+@@ -1821,15 +1820,15 @@ static int am65_cpsw_nuss_init_slave_por
+                       return ret;
+               }
+-              mac_addr = of_get_mac_address(port_np);
+-              if (!IS_ERR(mac_addr)) {
+-                      ether_addr_copy(port->slave.mac_addr, mac_addr);
+-              } else if (am65_cpsw_am654_get_efuse_macid(port_np,
+-                                                         port->port_id,
+-                                                         port->slave.mac_addr) ||
+-                         !is_valid_ether_addr(port->slave.mac_addr)) {
+-                      random_ether_addr(port->slave.mac_addr);
+-                      dev_err(dev, "Use random MAC address\n");
++              ret = of_get_mac_address(port_np, port->slave.mac_addr);
++              if (ret) {
++                      am65_cpsw_am654_get_efuse_macid(port_np,
++                                                      port->port_id,
++                                                      port->slave.mac_addr);
++                      if (!is_valid_ether_addr(port->slave.mac_addr)) {
++                              random_ether_addr(port->slave.mac_addr);
++                              dev_err(dev, "Use random MAC address\n");
++                      }
+               }
+       }
+       of_node_put(node);
+--- a/drivers/net/ethernet/ti/cpsw.c
++++ b/drivers/net/ethernet/ti/cpsw.c
+@@ -1308,7 +1308,6 @@ static int cpsw_probe_dt(struct cpsw_pla
+       for_each_available_child_of_node(node, slave_node) {
+               struct cpsw_slave_data *slave_data = data->slave_data + i;
+-              const void *mac_addr = NULL;
+               int lenp;
+               const __be32 *parp;
+@@ -1380,10 +1379,8 @@ static int cpsw_probe_dt(struct cpsw_pla
+               }
+ no_phy_slave:
+-              mac_addr = of_get_mac_address(slave_node);
+-              if (!IS_ERR(mac_addr)) {
+-                      ether_addr_copy(slave_data->mac_addr, mac_addr);
+-              } else {
++              ret = of_get_mac_address(slave_node, slave_data->mac_addr);
++              if (ret) {
+                       ret = ti_cm_get_macid(&pdev->dev, i,
+                                             slave_data->mac_addr);
+                       if (ret)
+--- a/drivers/net/ethernet/ti/cpsw_new.c
++++ b/drivers/net/ethernet/ti/cpsw_new.c
+@@ -1269,7 +1269,6 @@ static int cpsw_probe_dt(struct cpsw_com
+       for_each_child_of_node(tmp_node, port_np) {
+               struct cpsw_slave_data *slave_data;
+-              const void *mac_addr;
+               u32 port_id;
+               ret = of_property_read_u32(port_np, "reg", &port_id);
+@@ -1328,10 +1327,8 @@ static int cpsw_probe_dt(struct cpsw_com
+                       goto err_node_put;
+               }
+-              mac_addr = of_get_mac_address(port_np);
+-              if (!IS_ERR(mac_addr)) {
+-                      ether_addr_copy(slave_data->mac_addr, mac_addr);
+-              } else {
++              ret = of_get_mac_address(port_np, slave_data->mac_addr);
++              if (ret) {
+                       ret = ti_cm_get_macid(dev, port_id - 1,
+                                             slave_data->mac_addr);
+                       if (ret)
+--- a/drivers/net/ethernet/ti/davinci_emac.c
++++ b/drivers/net/ethernet/ti/davinci_emac.c
+@@ -1699,7 +1699,6 @@ davinci_emac_of_get_pdata(struct platfor
+       const struct of_device_id *match;
+       const struct emac_platform_data *auxdata;
+       struct emac_platform_data *pdata = NULL;
+-      const u8 *mac_addr;
+       if (!IS_ENABLED(CONFIG_OF) || !pdev->dev.of_node)
+               return dev_get_platdata(&pdev->dev);
+@@ -1711,11 +1710,8 @@ davinci_emac_of_get_pdata(struct platfor
+       np = pdev->dev.of_node;
+       pdata->version = EMAC_VERSION_2;
+-      if (!is_valid_ether_addr(pdata->mac_addr)) {
+-              mac_addr = of_get_mac_address(np);
+-              if (!IS_ERR(mac_addr))
+-                      ether_addr_copy(pdata->mac_addr, mac_addr);
+-      }
++      if (!is_valid_ether_addr(pdata->mac_addr))
++              of_get_mac_address(np, pdata->mac_addr);
+       of_property_read_u32(np, "ti,davinci-ctrl-reg-offset",
+                            &pdata->ctrl_reg_offset);
+--- a/drivers/net/ethernet/ti/netcp_core.c
++++ b/drivers/net/ethernet/ti/netcp_core.c
+@@ -1966,7 +1966,6 @@ static int netcp_create_interface(struct
+       struct resource res;
+       void __iomem *efuse = NULL;
+       u32 efuse_mac = 0;
+-      const void *mac_addr;
+       u8 efuse_mac_addr[6];
+       u32 temp[2];
+       int ret = 0;
+@@ -2036,10 +2035,8 @@ static int netcp_create_interface(struct
+               devm_iounmap(dev, efuse);
+               devm_release_mem_region(dev, res.start, size);
+       } else {
+-              mac_addr = of_get_mac_address(node_interface);
+-              if (!IS_ERR(mac_addr))
+-                      ether_addr_copy(ndev->dev_addr, mac_addr);
+-              else
++              ret = of_get_mac_address(node_interface, ndev->dev_addr);
++              if (ret)
+                       eth_random_addr(ndev->dev_addr);
+       }
+--- a/drivers/net/ethernet/wiznet/w5100-spi.c
++++ b/drivers/net/ethernet/wiznet/w5100-spi.c
+@@ -423,8 +423,14 @@ static int w5100_spi_probe(struct spi_de
+       const struct of_device_id *of_id;
+       const struct w5100_ops *ops;
+       kernel_ulong_t driver_data;
++      const void *mac = NULL;
++      u8 tmpmac[ETH_ALEN];
+       int priv_size;
+-      const void *mac = of_get_mac_address(spi->dev.of_node);
++      int ret;
++
++      ret = of_get_mac_address(spi->dev.of_node, tmpmac);
++      if (!ret)
++              mac = tmpmac;
+       if (spi->dev.of_node) {
+               of_id = of_match_device(w5100_of_match, &spi->dev);
+--- a/drivers/net/ethernet/wiznet/w5100.c
++++ b/drivers/net/ethernet/wiznet/w5100.c
+@@ -1159,7 +1159,7 @@ int w5100_probe(struct device *dev, cons
+       INIT_WORK(&priv->setrx_work, w5100_setrx_work);
+       INIT_WORK(&priv->restart_work, w5100_restart_work);
+-      if (!IS_ERR_OR_NULL(mac_addr))
++      if (mac_addr)
+               memcpy(ndev->dev_addr, mac_addr, ETH_ALEN);
+       else
+               eth_hw_addr_random(ndev);
+--- a/drivers/net/ethernet/xilinx/ll_temac_main.c
++++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
+@@ -438,7 +438,7 @@ static void temac_do_set_mac_address(str
+ static int temac_init_mac_address(struct net_device *ndev, const void *address)
+ {
+-      ether_addr_copy(ndev->dev_addr, address);
++      memcpy(ndev->dev_addr, address, ETH_ALEN);
+       if (!is_valid_ether_addr(ndev->dev_addr))
+               eth_hw_addr_random(ndev);
+       temac_do_set_mac_address(ndev);
+@@ -1370,7 +1370,7 @@ static int temac_probe(struct platform_d
+       struct device_node *temac_np = dev_of_node(&pdev->dev), *dma_np;
+       struct temac_local *lp;
+       struct net_device *ndev;
+-      const void *addr;
++      u8 addr[ETH_ALEN];
+       __be32 *p;
+       bool little_endian;
+       int rc = 0;
+@@ -1563,8 +1563,8 @@ static int temac_probe(struct platform_d
+       if (temac_np) {
+               /* Retrieve the MAC address */
+-              addr = of_get_mac_address(temac_np);
+-              if (IS_ERR(addr)) {
++              rc = of_get_mac_address(temac_np, addr);
++              if (rc) {
+                       dev_err(&pdev->dev, "could not find MAC address\n");
+                       return -ENODEV;
+               }
+--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
++++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
+@@ -1843,8 +1843,8 @@ static int axienet_probe(struct platform
+       struct device_node *np;
+       struct axienet_local *lp;
+       struct net_device *ndev;
+-      const void *mac_addr;
+       struct resource *ethres;
++      u8 mac_addr[ETH_ALEN];
+       int addr_width = 32;
+       u32 value;
+@@ -2044,13 +2044,14 @@ static int axienet_probe(struct platform
+               dev_info(&pdev->dev, "Ethernet core IRQ not defined\n");
+       /* Retrieve the MAC address */
+-      mac_addr = of_get_mac_address(pdev->dev.of_node);
+-      if (IS_ERR(mac_addr)) {
+-              dev_warn(&pdev->dev, "could not find MAC address property: %ld\n",
+-                       PTR_ERR(mac_addr));
+-              mac_addr = NULL;
++      ret = of_get_mac_address(pdev->dev.of_node, mac_addr);
++      if (!ret) {
++              axienet_set_mac_address(ndev, mac_addr);
++      } else {
++              dev_warn(&pdev->dev, "could not find MAC address property: %d\n",
++                       ret);
++              axienet_set_mac_address(ndev, NULL);
+       }
+-      axienet_set_mac_address(ndev, mac_addr);
+       lp->coalesce_count_rx = XAXIDMA_DFT_RX_THRESHOLD;
+       lp->coalesce_count_tx = XAXIDMA_DFT_TX_THRESHOLD;
+--- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c
++++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
+@@ -1107,7 +1107,6 @@ static int xemaclite_of_probe(struct pla
+       struct net_device *ndev = NULL;
+       struct net_local *lp = NULL;
+       struct device *dev = &ofdev->dev;
+-      const void *mac_address;
+       int rc = 0;
+@@ -1149,12 +1148,9 @@ static int xemaclite_of_probe(struct pla
+       lp->next_rx_buf_to_use = 0x0;
+       lp->tx_ping_pong = get_bool(ofdev, "xlnx,tx-ping-pong");
+       lp->rx_ping_pong = get_bool(ofdev, "xlnx,rx-ping-pong");
+-      mac_address = of_get_mac_address(ofdev->dev.of_node);
+-      if (!IS_ERR(mac_address)) {
+-              /* Set the MAC address. */
+-              ether_addr_copy(ndev->dev_addr, mac_address);
+-      } else {
++      rc = of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr);
++      if (rc) {
+               dev_warn(dev, "No MAC address found, using random\n");
+               eth_hw_addr_random(ndev);
+       }
+--- a/drivers/net/wireless/ath/ath9k/init.c
++++ b/drivers/net/wireless/ath/ath9k/init.c
+@@ -618,7 +618,6 @@ static int ath9k_of_init(struct ath_soft
+       struct ath_hw *ah = sc->sc_ah;
+       struct ath_common *common = ath9k_hw_common(ah);
+       enum ath_bus_type bus_type = common->bus_ops->ath_bus_type;
+-      const char *mac;
+       char eeprom_name[100];
+       int ret;
+@@ -641,9 +640,7 @@ static int ath9k_of_init(struct ath_soft
+               ah->ah_flags |= AH_NO_EEP_SWAP;
+       }
+-      mac = of_get_mac_address(np);
+-      if (!IS_ERR(mac))
+-              ether_addr_copy(common->macaddr, mac);
++      of_get_mac_address(np, common->macaddr);
+       return 0;
+ }
+--- a/drivers/net/wireless/mediatek/mt76/eeprom.c
++++ b/drivers/net/wireless/mediatek/mt76/eeprom.c
+@@ -90,15 +90,9 @@ out_put_node:
+ void
+ mt76_eeprom_override(struct mt76_dev *dev)
+ {
+-#ifdef CONFIG_OF
+       struct device_node *np = dev->dev->of_node;
+-      const u8 *mac = NULL;
+-      if (np)
+-              mac = of_get_mac_address(np);
+-      if (!IS_ERR_OR_NULL(mac))
+-              ether_addr_copy(dev->macaddr, mac);
+-#endif
++      of_get_mac_address(np, dev->macaddr);
+       if (!is_valid_ether_addr(dev->macaddr)) {
+               eth_random_addr(dev->macaddr);
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+@@ -990,11 +990,7 @@ static void rt2x00lib_rate(struct ieee80
+ void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr)
+ {
+-      const char *mac_addr;
+-
+-      mac_addr = of_get_mac_address(rt2x00dev->dev->of_node);
+-      if (!IS_ERR(mac_addr))
+-              ether_addr_copy(eeprom_mac_addr, mac_addr);
++      of_get_mac_address(rt2x00dev->dev->of_node, eeprom_mac_addr);
+       if (!is_valid_ether_addr(eeprom_mac_addr)) {
+               eth_random_addr(eeprom_mac_addr);
+--- a/drivers/of/of_net.c
++++ b/drivers/of/of_net.c
+@@ -45,37 +45,29 @@ int of_get_phy_mode(struct device_node *
+ }
+ EXPORT_SYMBOL_GPL(of_get_phy_mode);
+-static const void *of_get_mac_addr(struct device_node *np, const char *name)
++static int of_get_mac_addr(struct device_node *np, const char *name, u8 *addr)
+ {
+       struct property *pp = of_find_property(np, name, NULL);
+-      if (pp && pp->length == ETH_ALEN && is_valid_ether_addr(pp->value))
+-              return pp->value;
+-      return NULL;
++      if (pp && pp->length == ETH_ALEN && is_valid_ether_addr(pp->value)) {
++              memcpy(addr, pp->value, ETH_ALEN);
++              return 0;
++      }
++      return -ENODEV;
+ }
+-static const void *of_get_mac_addr_nvmem(struct device_node *np)
++static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr)
+ {
+-      int ret;
+-      const void *mac;
+-      u8 nvmem_mac[ETH_ALEN];
+       struct platform_device *pdev = of_find_device_by_node(np);
++      int ret;
+       if (!pdev)
+-              return ERR_PTR(-ENODEV);
++              return -ENODEV;
+-      ret = nvmem_get_mac_address(&pdev->dev, &nvmem_mac);
+-      if (ret) {
+-              put_device(&pdev->dev);
+-              return ERR_PTR(ret);
+-      }
+-
+-      mac = devm_kmemdup(&pdev->dev, nvmem_mac, ETH_ALEN, GFP_KERNEL);
++      ret = nvmem_get_mac_address(&pdev->dev, addr);
+       put_device(&pdev->dev);
+-      if (!mac)
+-              return ERR_PTR(-ENOMEM);
+-      return mac;
++      return ret;
+ }
+ /**
+@@ -98,24 +90,27 @@ static const void *of_get_mac_addr_nvmem
+  * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists
+  * but is all zeros.
+  *
+- * Return: Will be a valid pointer on success and ERR_PTR in case of error.
++ * Return: 0 on success and errno in case of error.
+ */
+-const void *of_get_mac_address(struct device_node *np)
++int of_get_mac_address(struct device_node *np, u8 *addr)
+ {
+-      const void *addr;
+-
+-      addr = of_get_mac_addr(np, "mac-address");
+-      if (addr)
+-              return addr;
++      int ret;
+-      addr = of_get_mac_addr(np, "local-mac-address");
+-      if (addr)
+-              return addr;
++      if (!np)
++              return -ENODEV;
+-      addr = of_get_mac_addr(np, "address");
+-      if (addr)
+-              return addr;
++      ret = of_get_mac_addr(np, "mac-address", addr);
++      if (!ret)
++              return 0;
++
++      ret = of_get_mac_addr(np, "local-mac-address", addr);
++      if (!ret)
++              return 0;
++
++      ret = of_get_mac_addr(np, "address", addr);
++      if (!ret)
++              return 0;
+-      return of_get_mac_addr_nvmem(np);
++      return of_get_mac_addr_nvmem(np, addr);
+ }
+ EXPORT_SYMBOL(of_get_mac_address);
+--- a/drivers/staging/octeon/ethernet.c
++++ b/drivers/staging/octeon/ethernet.c
+@@ -407,14 +407,10 @@ static int cvm_oct_common_set_mac_addres
+ int cvm_oct_common_init(struct net_device *dev)
+ {
+       struct octeon_ethernet *priv = netdev_priv(dev);
+-      const u8 *mac = NULL;
++      int ret;
+-      if (priv->of_node)
+-              mac = of_get_mac_address(priv->of_node);
+-
+-      if (!IS_ERR_OR_NULL(mac))
+-              ether_addr_copy(dev->dev_addr, mac);
+-      else
++      ret = of_get_mac_address(priv->of_node, dev->dev_addr);
++      if (ret)
+               eth_hw_addr_random(dev);
+       /*
+--- a/drivers/staging/wfx/main.c
++++ b/drivers/staging/wfx/main.c
+@@ -339,7 +339,6 @@ int wfx_probe(struct wfx_dev *wdev)
+ {
+       int i;
+       int err;
+-      const void *macaddr;
+       struct gpio_desc *gpio_saved;
+       // During first part of boot, gpio_wakeup cannot yet been used. So
+@@ -428,9 +427,9 @@ int wfx_probe(struct wfx_dev *wdev)
+       for (i = 0; i < ARRAY_SIZE(wdev->addresses); i++) {
+               eth_zero_addr(wdev->addresses[i].addr);
+-              macaddr = of_get_mac_address(wdev->dev->of_node);
+-              if (!IS_ERR_OR_NULL(macaddr)) {
+-                      ether_addr_copy(wdev->addresses[i].addr, macaddr);
++              err = of_get_mac_address(wdev->dev->of_node,
++                                       wdev->addresses[i].addr);
++              if (!err) {
+                       wdev->addresses[i].addr[ETH_ALEN - 1] += i;
+               } else {
+                       ether_addr_copy(wdev->addresses[i].addr,
+--- a/include/linux/of_net.h
++++ b/include/linux/of_net.h
+@@ -13,7 +13,7 @@
+ struct net_device;
+ extern int of_get_phy_mode(struct device_node *np, phy_interface_t *interface);
+-extern const void *of_get_mac_address(struct device_node *np);
++extern int of_get_mac_address(struct device_node *np, u8 *mac);
+ extern struct net_device *of_find_net_device_by_node(struct device_node *np);
+ #else
+ static inline int of_get_phy_mode(struct device_node *np,
+@@ -22,9 +22,9 @@ static inline int of_get_phy_mode(struct
+       return -ENODEV;
+ }
+-static inline const void *of_get_mac_address(struct device_node *np)
++static inline int of_get_mac_address(struct device_node *np, u8 *mac)
+ {
+-      return ERR_PTR(-ENODEV);
++      return -ENODEV;
+ }
+ static inline struct net_device *of_find_net_device_by_node(struct device_node *np)
+--- a/include/net/dsa.h
++++ b/include/net/dsa.h
+@@ -208,7 +208,7 @@ struct dsa_port {
+       unsigned int            index;
+       const char              *name;
+       struct dsa_port         *cpu_dp;
+-      const char              *mac;
++      u8                      mac[ETH_ALEN];
+       struct device_node      *dn;
+       unsigned int            ageing_time;
+       bool                    vlan_filtering;
+--- a/net/dsa/dsa2.c
++++ b/net/dsa/dsa2.c
+@@ -288,7 +288,7 @@ static int dsa_port_setup(struct dsa_por
+               break;
+       case DSA_PORT_TYPE_USER:
+-              dp->mac = of_get_mac_address(dp->dn);
++              of_get_mac_address(dp->dn, dp->mac);
+               err = dsa_slave_create(dp);
+               if (err)
+                       break;
+--- a/net/dsa/slave.c
++++ b/net/dsa/slave.c
+@@ -1855,7 +1855,7 @@ int dsa_slave_create(struct dsa_port *po
+       slave_dev->hw_features |= NETIF_F_HW_TC;
+       slave_dev->features |= NETIF_F_LLTX;
+       slave_dev->ethtool_ops = &dsa_slave_ethtool_ops;
+-      if (!IS_ERR_OR_NULL(port->mac))
++      if (!is_zero_ether_addr(port->mac))
+               ether_addr_copy(slave_dev->dev_addr, port->mac);
+       else
+               eth_hw_addr_inherit(slave_dev, master);
+--- a/net/ethernet/eth.c
++++ b/net/ethernet/eth.c
+@@ -506,13 +506,14 @@ unsigned char * __weak arch_get_platform
+ int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr)
+ {
+-      const unsigned char *addr = NULL;
++      unsigned char *addr;
++      int ret;
+-      if (dev->of_node)
+-              addr = of_get_mac_address(dev->of_node);
+-      if (IS_ERR_OR_NULL(addr))
+-              addr = arch_get_platform_mac_address();
++      ret = of_get_mac_address(dev->of_node, mac_addr);
++      if (!ret)
++              return 0;
++      addr = arch_get_platform_mac_address();
+       if (!addr)
+               return -ENODEV;
diff --git a/target/linux/generic/backport-5.10/732-v5.13-0009-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-de.patch b/target/linux/generic/backport-5.10/732-v5.13-0009-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-de.patch
new file mode 100644 (file)
index 0000000..260a325
--- /dev/null
@@ -0,0 +1,77 @@
+From f10843e04a075202dbb39dfcee047e3a2fdf5a8d Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael@walle.cc>
+Date: Mon, 12 Apr 2021 19:47:18 +0200
+Subject: [PATCH] of: net: fix of_get_mac_addr_nvmem() for non-platform devices
+
+of_get_mac_address() already supports fetching the MAC address by an
+nvmem provider. But until now, it was just working for platform devices.
+Esp. it was not working for DSA ports and PCI devices. It gets more
+common that PCI devices have a device tree binding since SoCs contain
+integrated root complexes.
+
+Use the nvmem of_* binding to fetch the nvmem cells by a struct
+device_node. We still have to try to read the cell by device first
+because there might be a nvmem_cell_lookup associated with that device.
+
+Signed-off-by: Michael Walle <michael@walle.cc>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/of/of_net.c | 35 ++++++++++++++++++++++++++++++-----
+ 1 file changed, 30 insertions(+), 5 deletions(-)
+
+--- a/drivers/of/of_net.c
++++ b/drivers/of/of_net.c
+@@ -11,6 +11,7 @@
+ #include <linux/phy.h>
+ #include <linux/export.h>
+ #include <linux/device.h>
++#include <linux/nvmem-consumer.h>
+ /**
+  * of_get_phy_mode - Get phy mode for given device_node
+@@ -59,15 +60,39 @@ static int of_get_mac_addr(struct device
+ static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr)
+ {
+       struct platform_device *pdev = of_find_device_by_node(np);
++      struct nvmem_cell *cell;
++      const void *mac;
++      size_t len;
+       int ret;
+-      if (!pdev)
+-              return -ENODEV;
++      /* Try lookup by device first, there might be a nvmem_cell_lookup
++       * associated with a given device.
++       */
++      if (pdev) {
++              ret = nvmem_get_mac_address(&pdev->dev, addr);
++              put_device(&pdev->dev);
++              return ret;
++      }
++
++      cell = of_nvmem_cell_get(np, "mac-address");
++      if (IS_ERR(cell))
++              return PTR_ERR(cell);
++
++      mac = nvmem_cell_read(cell, &len);
++      nvmem_cell_put(cell);
++
++      if (IS_ERR(mac))
++              return PTR_ERR(mac);
++
++      if (len != ETH_ALEN || !is_valid_ether_addr(mac)) {
++              kfree(mac);
++              return -EINVAL;
++      }
+-      ret = nvmem_get_mac_address(&pdev->dev, addr);
+-      put_device(&pdev->dev);
++      memcpy(addr, mac, ETH_ALEN);
++      kfree(mac);
+-      return ret;
++      return 0;
+ }
+ /**
diff --git a/target/linux/generic/backport-5.10/825-v5.15-of-unify-of_count_phandle_with_args-arguments-with-C.patch b/target/linux/generic/backport-5.10/825-v5.15-of-unify-of_count_phandle_with_args-arguments-with-C.patch
new file mode 100644 (file)
index 0000000..ee5b7a0
--- /dev/null
@@ -0,0 +1,27 @@
+From a065d5615fc83908ef21ed8159ffb63d816ff5de Mon Sep 17 00:00:00 2001
+From: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
+Date: Wed, 28 Jul 2021 16:42:27 +0200
+Subject: [PATCH] of: unify of_count_phandle_with_args() arguments with
+ !CONFIG_OF
+
+Unify the declaration of of_count_phandle_with_args() between enabled
+and disabled OF by making constifying pointed device_node.
+
+Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
+Reviewed-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+---
+ include/linux/of.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -889,7 +889,7 @@ static inline int of_parse_phandle_with_
+       return -ENOSYS;
+ }
+-static inline int of_count_phandle_with_args(struct device_node *np,
++static inline int of_count_phandle_with_args(const struct device_node *np,
+                                            const char *list_name,
+                                            const char *cells_name)
+ {
diff --git a/target/linux/generic/backport-5.10/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch b/target/linux/generic/backport-5.10/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch
new file mode 100644 (file)
index 0000000..b6ef67d
--- /dev/null
@@ -0,0 +1,359 @@
+From 66a8f7f04979f4ad739085f01d99c8caf620b4f5 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael@walle.cc>
+Date: Tue, 18 Jan 2022 18:35:02 +0100
+Subject: [PATCH] of: base: make small of_parse_phandle() variants static
+ inline
+
+Make all the smaller variants of the of_parse_phandle() static inline.
+This also let us remove the empty function stubs if CONFIG_OF is not
+defined.
+
+Suggested-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Michael Walle <michael@walle.cc>
+[robh: move index < 0 check into __of_parse_phandle_with_args]
+Signed-off-by: Rob Herring <robh@kernel.org>
+Link: https://lore.kernel.org/r/20220118173504.2867523-2-michael@walle.cc
+---
+ drivers/of/base.c  | 131 +++------------------------------------
+ include/linux/of.h | 148 ++++++++++++++++++++++++++++++++++++---------
+ 2 files changed, 129 insertions(+), 150 deletions(-)
+
+--- a/drivers/of/base.c
++++ b/drivers/of/base.c
+@@ -1372,15 +1372,18 @@ int of_phandle_iterator_args(struct of_p
+       return count;
+ }
+-static int __of_parse_phandle_with_args(const struct device_node *np,
+-                                      const char *list_name,
+-                                      const char *cells_name,
+-                                      int cell_count, int index,
+-                                      struct of_phandle_args *out_args)
++int __of_parse_phandle_with_args(const struct device_node *np,
++                               const char *list_name,
++                               const char *cells_name,
++                               int cell_count, int index,
++                               struct of_phandle_args *out_args)
+ {
+       struct of_phandle_iterator it;
+       int rc, cur_index = 0;
++      if (index < 0)
++              return -EINVAL;
++
+       /* Loop over the phandles until all the requested entry is found */
+       of_for_each_phandle(&it, rc, np, list_name, cells_name, cell_count) {
+               /*
+@@ -1423,82 +1426,7 @@ static int __of_parse_phandle_with_args(
+       of_node_put(it.node);
+       return rc;
+ }
+-
+-/**
+- * of_parse_phandle - Resolve a phandle property to a device_node pointer
+- * @np: Pointer to device node holding phandle property
+- * @phandle_name: Name of property holding a phandle value
+- * @index: For properties holding a table of phandles, this is the index into
+- *         the table
+- *
+- * Return: The device_node pointer with refcount incremented.  Use
+- * of_node_put() on it when done.
+- */
+-struct device_node *of_parse_phandle(const struct device_node *np,
+-                                   const char *phandle_name, int index)
+-{
+-      struct of_phandle_args args;
+-
+-      if (index < 0)
+-              return NULL;
+-
+-      if (__of_parse_phandle_with_args(np, phandle_name, NULL, 0,
+-                                       index, &args))
+-              return NULL;
+-
+-      return args.np;
+-}
+-EXPORT_SYMBOL(of_parse_phandle);
+-
+-/**
+- * of_parse_phandle_with_args() - Find a node pointed by phandle in a list
+- * @np:               pointer to a device tree node containing a list
+- * @list_name:        property name that contains a list
+- * @cells_name:       property name that specifies phandles' arguments count
+- * @index:    index of a phandle to parse out
+- * @out_args: optional pointer to output arguments structure (will be filled)
+- *
+- * This function is useful to parse lists of phandles and their arguments.
+- * Returns 0 on success and fills out_args, on error returns appropriate
+- * errno value.
+- *
+- * Caller is responsible to call of_node_put() on the returned out_args->np
+- * pointer.
+- *
+- * Example::
+- *
+- *  phandle1: node1 {
+- *    #list-cells = <2>;
+- *  };
+- *
+- *  phandle2: node2 {
+- *    #list-cells = <1>;
+- *  };
+- *
+- *  node3 {
+- *    list = <&phandle1 1 2 &phandle2 3>;
+- *  };
+- *
+- * To get a device_node of the ``node2`` node you may call this:
+- * of_parse_phandle_with_args(node3, "list", "#list-cells", 1, &args);
+- */
+-int of_parse_phandle_with_args(const struct device_node *np, const char *list_name,
+-                              const char *cells_name, int index,
+-                              struct of_phandle_args *out_args)
+-{
+-      int cell_count = -1;
+-
+-      if (index < 0)
+-              return -EINVAL;
+-
+-      /* If cells_name is NULL we assume a cell count of 0 */
+-      if (!cells_name)
+-              cell_count = 0;
+-
+-      return __of_parse_phandle_with_args(np, list_name, cells_name,
+-                                          cell_count, index, out_args);
+-}
+-EXPORT_SYMBOL(of_parse_phandle_with_args);
++EXPORT_SYMBOL(__of_parse_phandle_with_args);
+ /**
+  * of_parse_phandle_with_args_map() - Find a node pointed by phandle in a list and remap it
+@@ -1685,47 +1613,6 @@ free:
+ EXPORT_SYMBOL(of_parse_phandle_with_args_map);
+ /**
+- * of_parse_phandle_with_fixed_args() - Find a node pointed by phandle in a list
+- * @np:               pointer to a device tree node containing a list
+- * @list_name:        property name that contains a list
+- * @cell_count: number of argument cells following the phandle
+- * @index:    index of a phandle to parse out
+- * @out_args: optional pointer to output arguments structure (will be filled)
+- *
+- * This function is useful to parse lists of phandles and their arguments.
+- * Returns 0 on success and fills out_args, on error returns appropriate
+- * errno value.
+- *
+- * Caller is responsible to call of_node_put() on the returned out_args->np
+- * pointer.
+- *
+- * Example::
+- *
+- *  phandle1: node1 {
+- *  };
+- *
+- *  phandle2: node2 {
+- *  };
+- *
+- *  node3 {
+- *    list = <&phandle1 0 2 &phandle2 2 3>;
+- *  };
+- *
+- * To get a device_node of the ``node2`` node you may call this:
+- * of_parse_phandle_with_fixed_args(node3, "list", 2, 1, &args);
+- */
+-int of_parse_phandle_with_fixed_args(const struct device_node *np,
+-                              const char *list_name, int cell_count,
+-                              int index, struct of_phandle_args *out_args)
+-{
+-      if (index < 0)
+-              return -EINVAL;
+-      return __of_parse_phandle_with_args(np, list_name, NULL, cell_count,
+-                                         index, out_args);
+-}
+-EXPORT_SYMBOL(of_parse_phandle_with_fixed_args);
+-
+-/**
+  * of_count_phandle_with_args() - Find the number of phandles references in a property
+  * @np:               pointer to a device tree node containing a list
+  * @list_name:        property name that contains a list
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -363,18 +363,12 @@ extern const struct of_device_id *of_mat
+       const struct of_device_id *matches, const struct device_node *node);
+ extern int of_modalias_node(struct device_node *node, char *modalias, int len);
+ extern void of_print_phandle_args(const char *msg, const struct of_phandle_args *args);
+-extern struct device_node *of_parse_phandle(const struct device_node *np,
+-                                          const char *phandle_name,
+-                                          int index);
+-extern int of_parse_phandle_with_args(const struct device_node *np,
+-      const char *list_name, const char *cells_name, int index,
+-      struct of_phandle_args *out_args);
++extern int __of_parse_phandle_with_args(const struct device_node *np,
++      const char *list_name, const char *cells_name, int cell_count,
++      int index, struct of_phandle_args *out_args);
+ extern int of_parse_phandle_with_args_map(const struct device_node *np,
+       const char *list_name, const char *stem_name, int index,
+       struct of_phandle_args *out_args);
+-extern int of_parse_phandle_with_fixed_args(const struct device_node *np,
+-      const char *list_name, int cells_count, int index,
+-      struct of_phandle_args *out_args);
+ extern int of_count_phandle_with_args(const struct device_node *np,
+       const char *list_name, const char *cells_name);
+@@ -857,18 +851,12 @@ static inline int of_property_read_strin
+       return -ENOSYS;
+ }
+-static inline struct device_node *of_parse_phandle(const struct device_node *np,
+-                                                 const char *phandle_name,
+-                                                 int index)
+-{
+-      return NULL;
+-}
+-
+-static inline int of_parse_phandle_with_args(const struct device_node *np,
+-                                           const char *list_name,
+-                                           const char *cells_name,
+-                                           int index,
+-                                           struct of_phandle_args *out_args)
++static inline int __of_parse_phandle_with_args(const struct device_node *np,
++                                             const char *list_name,
++                                             const char *cells_name,
++                                             int cell_count,
++                                             int index,
++                                             struct of_phandle_args *out_args)
+ {
+       return -ENOSYS;
+ }
+@@ -882,13 +870,6 @@ static inline int of_parse_phandle_with_
+       return -ENOSYS;
+ }
+-static inline int of_parse_phandle_with_fixed_args(const struct device_node *np,
+-      const char *list_name, int cells_count, int index,
+-      struct of_phandle_args *out_args)
+-{
+-      return -ENOSYS;
+-}
+-
+ static inline int of_count_phandle_with_args(const struct device_node *np,
+                                            const char *list_name,
+                                            const char *cells_name)
+@@ -1065,6 +1046,117 @@ static inline bool of_node_is_type(const
+ }
+ /**
++ * of_parse_phandle - Resolve a phandle property to a device_node pointer
++ * @np: Pointer to device node holding phandle property
++ * @phandle_name: Name of property holding a phandle value
++ * @index: For properties holding a table of phandles, this is the index into
++ *         the table
++ *
++ * Return: The device_node pointer with refcount incremented.  Use
++ * of_node_put() on it when done.
++ */
++static inline struct device_node *of_parse_phandle(const struct device_node *np,
++                                                 const char *phandle_name,
++                                                 int index)
++{
++      struct of_phandle_args args;
++
++      if (__of_parse_phandle_with_args(np, phandle_name, NULL, 0,
++                                       index, &args))
++              return NULL;
++
++      return args.np;
++}
++
++/**
++ * of_parse_phandle_with_args() - Find a node pointed by phandle in a list
++ * @np:               pointer to a device tree node containing a list
++ * @list_name:        property name that contains a list
++ * @cells_name:       property name that specifies phandles' arguments count
++ * @index:    index of a phandle to parse out
++ * @out_args: optional pointer to output arguments structure (will be filled)
++ *
++ * This function is useful to parse lists of phandles and their arguments.
++ * Returns 0 on success and fills out_args, on error returns appropriate
++ * errno value.
++ *
++ * Caller is responsible to call of_node_put() on the returned out_args->np
++ * pointer.
++ *
++ * Example::
++ *
++ *  phandle1: node1 {
++ *    #list-cells = <2>;
++ *  };
++ *
++ *  phandle2: node2 {
++ *    #list-cells = <1>;
++ *  };
++ *
++ *  node3 {
++ *    list = <&phandle1 1 2 &phandle2 3>;
++ *  };
++ *
++ * To get a device_node of the ``node2`` node you may call this:
++ * of_parse_phandle_with_args(node3, "list", "#list-cells", 1, &args);
++ */
++static inline int of_parse_phandle_with_args(const struct device_node *np,
++                                           const char *list_name,
++                                           const char *cells_name,
++                                           int index,
++                                           struct of_phandle_args *out_args)
++{
++      int cell_count = -1;
++
++      /* If cells_name is NULL we assume a cell count of 0 */
++      if (!cells_name)
++              cell_count = 0;
++
++      return __of_parse_phandle_with_args(np, list_name, cells_name,
++                                          cell_count, index, out_args);
++}
++
++/**
++ * of_parse_phandle_with_fixed_args() - Find a node pointed by phandle in a list
++ * @np:               pointer to a device tree node containing a list
++ * @list_name:        property name that contains a list
++ * @cell_count: number of argument cells following the phandle
++ * @index:    index of a phandle to parse out
++ * @out_args: optional pointer to output arguments structure (will be filled)
++ *
++ * This function is useful to parse lists of phandles and their arguments.
++ * Returns 0 on success and fills out_args, on error returns appropriate
++ * errno value.
++ *
++ * Caller is responsible to call of_node_put() on the returned out_args->np
++ * pointer.
++ *
++ * Example::
++ *
++ *  phandle1: node1 {
++ *  };
++ *
++ *  phandle2: node2 {
++ *  };
++ *
++ *  node3 {
++ *    list = <&phandle1 0 2 &phandle2 2 3>;
++ *  };
++ *
++ * To get a device_node of the ``node2`` node you may call this:
++ * of_parse_phandle_with_fixed_args(node3, "list", 2, 1, &args);
++ */
++static inline int of_parse_phandle_with_fixed_args(const struct device_node *np,
++                                                 const char *list_name,
++                                                 int cell_count,
++                                                 int index,
++                                                 struct of_phandle_args *out_args)
++{
++      return __of_parse_phandle_with_args(np, list_name, NULL, cell_count,
++                                          index, out_args);
++}
++
++/**
+  * of_property_count_u8_elems - Count the number of u8 elements in a property
+  *
+  * @np:               device node from which the property value is to be read.
diff --git a/target/linux/generic/backport-5.10/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch b/target/linux/generic/backport-5.10/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch
new file mode 100644 (file)
index 0000000..a3df3ce
--- /dev/null
@@ -0,0 +1,56 @@
+From 8eddceb280f5deb8046fcb660de9f9f683b408b9 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael@walle.cc>
+Date: Tue, 6 Dec 2022 21:07:21 +0100
+Subject: [PATCH] of: base: add of_parse_phandle_with_optional_args()
+
+Add a new variant of the of_parse_phandle_with_args() which treats the
+cells name as optional. If it's missing, it is assumed that the phandle
+has no arguments.
+
+Up until now, a nvmem node didn't have any arguments, so all the device
+trees haven't any '#*-cells' property. But there is a need for an
+additional argument for the phandle, for which we need a '#*-cells'
+property. Therefore, we need to support nvmem nodes with and without
+this property.
+
+Signed-off-by: Michael Walle <michael@walle.cc>
+Reviewed-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+---
+ include/linux/of.h | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -1157,6 +1157,31 @@ static inline int of_parse_phandle_with_
+ }
+ /**
++ * of_parse_phandle_with_optional_args() - Find a node pointed by phandle in a list
++ * @np:               pointer to a device tree node containing a list
++ * @list_name:        property name that contains a list
++ * @cells_name:       property name that specifies phandles' arguments count
++ * @index:    index of a phandle to parse out
++ * @out_args: optional pointer to output arguments structure (will be filled)
++ *
++ * Same as of_parse_phandle_with_args() except that if the cells_name property
++ * is not found, cell_count of 0 is assumed.
++ *
++ * This is used to useful, if you have a phandle which didn't have arguments
++ * before and thus doesn't have a '#*-cells' property but is now migrated to
++ * having arguments while retaining backwards compatibility.
++ */
++static inline int of_parse_phandle_with_optional_args(const struct device_node *np,
++                                                    const char *list_name,
++                                                    const char *cells_name,
++                                                    int index,
++                                                    struct of_phandle_args *out_args)
++{
++      return __of_parse_phandle_with_args(np, list_name, cells_name,
++                                          0, index, out_args);
++}
++
++/**
+  * of_property_count_u8_elems - Count the number of u8 elements in a property
+  *
+  * @np:               device node from which the property value is to be read.
diff --git a/target/linux/generic/backport-5.10/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch b/target/linux/generic/backport-5.10/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch
new file mode 100644 (file)
index 0000000..95b0e60
--- /dev/null
@@ -0,0 +1,32 @@
+From 4f4145c9fee8c7a445dbbbadceccce5391e6b287 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael@walle.cc>
+Date: Tue, 6 Dec 2022 21:07:22 +0100
+Subject: [PATCH] of: property: make #.*-cells optional for simple props
+
+Sometimes, future bindings for phandles will get additional arguments.
+Thus the target node of the phandle will need a new #.*-cells property.
+To be backwards compatible, this needs to be optional.
+
+Prepare the DEFINE_SIMPLE_PROPS() to handle the cells name as optional.
+
+Signed-off-by: Michael Walle <michael@walle.cc>
+Tested-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Reviewed-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+---
+ drivers/of/property.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/of/property.c
++++ b/drivers/of/property.c
+@@ -1267,8 +1267,8 @@ static struct device_node *parse_suffix_
+       if (strcmp_suffix(prop_name, suffix))
+               return NULL;
+-      if (of_parse_phandle_with_args(np, prop_name, cells_name, index,
+-                                     &sup_args))
++      if (__of_parse_phandle_with_args(np, prop_name, cells_name, 0, index,
++                                       &sup_args))
+               return NULL;
+       return sup_args.np;
diff --git a/target/linux/generic/backport-5.10/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch b/target/linux/generic/backport-5.10/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch
new file mode 100644 (file)
index 0000000..5d1df95
--- /dev/null
@@ -0,0 +1,28 @@
+From 9cf9486a6a7e8a3d76154d0c506051ba3740e8b6 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael@walle.cc>
+Date: Tue, 6 Dec 2022 21:07:23 +0100
+Subject: [PATCH] of: property: add #nvmem-cell-cells property
+
+Bindings describe the new '#nvmem-cell-cells' property. Now that the
+arguments count property is optional, we just add this property to the
+nvmem-cells.
+
+Signed-off-by: Michael Walle <michael@walle.cc>
+Tested-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Reviewed-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+---
+ drivers/of/property.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/of/property.c
++++ b/drivers/of/property.c
+@@ -1314,7 +1314,7 @@ DEFINE_SIMPLE_PROP(hwlocks, "hwlocks", "
+ DEFINE_SIMPLE_PROP(extcon, "extcon", NULL)
+ DEFINE_SIMPLE_PROP(interrupts_extended, "interrupts-extended",
+                                       "#interrupt-cells")
+-DEFINE_SIMPLE_PROP(nvmem_cells, "nvmem-cells", NULL)
++DEFINE_SIMPLE_PROP(nvmem_cells, "nvmem-cells", "#nvmem-cell-cells")
+ DEFINE_SIMPLE_PROP(phys, "phys", "#phy-cells")
+ DEFINE_SIMPLE_PROP(wakeup_parent, "wakeup-parent", NULL)
+ DEFINE_SIMPLE_PROP(pinctrl0, "pinctrl-0", NULL)
diff --git a/target/linux/generic/backport-5.15/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch b/target/linux/generic/backport-5.15/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch
new file mode 100644 (file)
index 0000000..b00cf57
--- /dev/null
@@ -0,0 +1,359 @@
+From 66a8f7f04979f4ad739085f01d99c8caf620b4f5 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael@walle.cc>
+Date: Tue, 18 Jan 2022 18:35:02 +0100
+Subject: [PATCH] of: base: make small of_parse_phandle() variants static
+ inline
+
+Make all the smaller variants of the of_parse_phandle() static inline.
+This also let us remove the empty function stubs if CONFIG_OF is not
+defined.
+
+Suggested-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Michael Walle <michael@walle.cc>
+[robh: move index < 0 check into __of_parse_phandle_with_args]
+Signed-off-by: Rob Herring <robh@kernel.org>
+Link: https://lore.kernel.org/r/20220118173504.2867523-2-michael@walle.cc
+---
+ drivers/of/base.c  | 131 +++------------------------------------
+ include/linux/of.h | 148 ++++++++++++++++++++++++++++++++++++---------
+ 2 files changed, 129 insertions(+), 150 deletions(-)
+
+--- a/drivers/of/base.c
++++ b/drivers/of/base.c
+@@ -1371,15 +1371,18 @@ int of_phandle_iterator_args(struct of_p
+       return count;
+ }
+-static int __of_parse_phandle_with_args(const struct device_node *np,
+-                                      const char *list_name,
+-                                      const char *cells_name,
+-                                      int cell_count, int index,
+-                                      struct of_phandle_args *out_args)
++int __of_parse_phandle_with_args(const struct device_node *np,
++                               const char *list_name,
++                               const char *cells_name,
++                               int cell_count, int index,
++                               struct of_phandle_args *out_args)
+ {
+       struct of_phandle_iterator it;
+       int rc, cur_index = 0;
++      if (index < 0)
++              return -EINVAL;
++
+       /* Loop over the phandles until all the requested entry is found */
+       of_for_each_phandle(&it, rc, np, list_name, cells_name, cell_count) {
+               /*
+@@ -1422,82 +1425,7 @@ static int __of_parse_phandle_with_args(
+       of_node_put(it.node);
+       return rc;
+ }
+-
+-/**
+- * of_parse_phandle - Resolve a phandle property to a device_node pointer
+- * @np: Pointer to device node holding phandle property
+- * @phandle_name: Name of property holding a phandle value
+- * @index: For properties holding a table of phandles, this is the index into
+- *         the table
+- *
+- * Return: The device_node pointer with refcount incremented.  Use
+- * of_node_put() on it when done.
+- */
+-struct device_node *of_parse_phandle(const struct device_node *np,
+-                                   const char *phandle_name, int index)
+-{
+-      struct of_phandle_args args;
+-
+-      if (index < 0)
+-              return NULL;
+-
+-      if (__of_parse_phandle_with_args(np, phandle_name, NULL, 0,
+-                                       index, &args))
+-              return NULL;
+-
+-      return args.np;
+-}
+-EXPORT_SYMBOL(of_parse_phandle);
+-
+-/**
+- * of_parse_phandle_with_args() - Find a node pointed by phandle in a list
+- * @np:               pointer to a device tree node containing a list
+- * @list_name:        property name that contains a list
+- * @cells_name:       property name that specifies phandles' arguments count
+- * @index:    index of a phandle to parse out
+- * @out_args: optional pointer to output arguments structure (will be filled)
+- *
+- * This function is useful to parse lists of phandles and their arguments.
+- * Returns 0 on success and fills out_args, on error returns appropriate
+- * errno value.
+- *
+- * Caller is responsible to call of_node_put() on the returned out_args->np
+- * pointer.
+- *
+- * Example::
+- *
+- *  phandle1: node1 {
+- *    #list-cells = <2>;
+- *  };
+- *
+- *  phandle2: node2 {
+- *    #list-cells = <1>;
+- *  };
+- *
+- *  node3 {
+- *    list = <&phandle1 1 2 &phandle2 3>;
+- *  };
+- *
+- * To get a device_node of the ``node2`` node you may call this:
+- * of_parse_phandle_with_args(node3, "list", "#list-cells", 1, &args);
+- */
+-int of_parse_phandle_with_args(const struct device_node *np, const char *list_name,
+-                              const char *cells_name, int index,
+-                              struct of_phandle_args *out_args)
+-{
+-      int cell_count = -1;
+-
+-      if (index < 0)
+-              return -EINVAL;
+-
+-      /* If cells_name is NULL we assume a cell count of 0 */
+-      if (!cells_name)
+-              cell_count = 0;
+-
+-      return __of_parse_phandle_with_args(np, list_name, cells_name,
+-                                          cell_count, index, out_args);
+-}
+-EXPORT_SYMBOL(of_parse_phandle_with_args);
++EXPORT_SYMBOL(__of_parse_phandle_with_args);
+ /**
+  * of_parse_phandle_with_args_map() - Find a node pointed by phandle in a list and remap it
+@@ -1684,47 +1612,6 @@ free:
+ EXPORT_SYMBOL(of_parse_phandle_with_args_map);
+ /**
+- * of_parse_phandle_with_fixed_args() - Find a node pointed by phandle in a list
+- * @np:               pointer to a device tree node containing a list
+- * @list_name:        property name that contains a list
+- * @cell_count: number of argument cells following the phandle
+- * @index:    index of a phandle to parse out
+- * @out_args: optional pointer to output arguments structure (will be filled)
+- *
+- * This function is useful to parse lists of phandles and their arguments.
+- * Returns 0 on success and fills out_args, on error returns appropriate
+- * errno value.
+- *
+- * Caller is responsible to call of_node_put() on the returned out_args->np
+- * pointer.
+- *
+- * Example::
+- *
+- *  phandle1: node1 {
+- *  };
+- *
+- *  phandle2: node2 {
+- *  };
+- *
+- *  node3 {
+- *    list = <&phandle1 0 2 &phandle2 2 3>;
+- *  };
+- *
+- * To get a device_node of the ``node2`` node you may call this:
+- * of_parse_phandle_with_fixed_args(node3, "list", 2, 1, &args);
+- */
+-int of_parse_phandle_with_fixed_args(const struct device_node *np,
+-                              const char *list_name, int cell_count,
+-                              int index, struct of_phandle_args *out_args)
+-{
+-      if (index < 0)
+-              return -EINVAL;
+-      return __of_parse_phandle_with_args(np, list_name, NULL, cell_count,
+-                                         index, out_args);
+-}
+-EXPORT_SYMBOL(of_parse_phandle_with_fixed_args);
+-
+-/**
+  * of_count_phandle_with_args() - Find the number of phandles references in a property
+  * @np:               pointer to a device tree node containing a list
+  * @list_name:        property name that contains a list
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -363,18 +363,12 @@ extern const struct of_device_id *of_mat
+       const struct of_device_id *matches, const struct device_node *node);
+ extern int of_modalias_node(struct device_node *node, char *modalias, int len);
+ extern void of_print_phandle_args(const char *msg, const struct of_phandle_args *args);
+-extern struct device_node *of_parse_phandle(const struct device_node *np,
+-                                          const char *phandle_name,
+-                                          int index);
+-extern int of_parse_phandle_with_args(const struct device_node *np,
+-      const char *list_name, const char *cells_name, int index,
+-      struct of_phandle_args *out_args);
++extern int __of_parse_phandle_with_args(const struct device_node *np,
++      const char *list_name, const char *cells_name, int cell_count,
++      int index, struct of_phandle_args *out_args);
+ extern int of_parse_phandle_with_args_map(const struct device_node *np,
+       const char *list_name, const char *stem_name, int index,
+       struct of_phandle_args *out_args);
+-extern int of_parse_phandle_with_fixed_args(const struct device_node *np,
+-      const char *list_name, int cells_count, int index,
+-      struct of_phandle_args *out_args);
+ extern int of_count_phandle_with_args(const struct device_node *np,
+       const char *list_name, const char *cells_name);
+@@ -864,18 +858,12 @@ static inline int of_property_read_strin
+       return -ENOSYS;
+ }
+-static inline struct device_node *of_parse_phandle(const struct device_node *np,
+-                                                 const char *phandle_name,
+-                                                 int index)
+-{
+-      return NULL;
+-}
+-
+-static inline int of_parse_phandle_with_args(const struct device_node *np,
+-                                           const char *list_name,
+-                                           const char *cells_name,
+-                                           int index,
+-                                           struct of_phandle_args *out_args)
++static inline int __of_parse_phandle_with_args(const struct device_node *np,
++                                             const char *list_name,
++                                             const char *cells_name,
++                                             int cell_count,
++                                             int index,
++                                             struct of_phandle_args *out_args)
+ {
+       return -ENOSYS;
+ }
+@@ -889,13 +877,6 @@ static inline int of_parse_phandle_with_
+       return -ENOSYS;
+ }
+-static inline int of_parse_phandle_with_fixed_args(const struct device_node *np,
+-      const char *list_name, int cells_count, int index,
+-      struct of_phandle_args *out_args)
+-{
+-      return -ENOSYS;
+-}
+-
+ static inline int of_count_phandle_with_args(const struct device_node *np,
+                                            const char *list_name,
+                                            const char *cells_name)
+@@ -1077,6 +1058,117 @@ static inline bool of_node_is_type(const
+ }
+ /**
++ * of_parse_phandle - Resolve a phandle property to a device_node pointer
++ * @np: Pointer to device node holding phandle property
++ * @phandle_name: Name of property holding a phandle value
++ * @index: For properties holding a table of phandles, this is the index into
++ *         the table
++ *
++ * Return: The device_node pointer with refcount incremented.  Use
++ * of_node_put() on it when done.
++ */
++static inline struct device_node *of_parse_phandle(const struct device_node *np,
++                                                 const char *phandle_name,
++                                                 int index)
++{
++      struct of_phandle_args args;
++
++      if (__of_parse_phandle_with_args(np, phandle_name, NULL, 0,
++                                       index, &args))
++              return NULL;
++
++      return args.np;
++}
++
++/**
++ * of_parse_phandle_with_args() - Find a node pointed by phandle in a list
++ * @np:               pointer to a device tree node containing a list
++ * @list_name:        property name that contains a list
++ * @cells_name:       property name that specifies phandles' arguments count
++ * @index:    index of a phandle to parse out
++ * @out_args: optional pointer to output arguments structure (will be filled)
++ *
++ * This function is useful to parse lists of phandles and their arguments.
++ * Returns 0 on success and fills out_args, on error returns appropriate
++ * errno value.
++ *
++ * Caller is responsible to call of_node_put() on the returned out_args->np
++ * pointer.
++ *
++ * Example::
++ *
++ *  phandle1: node1 {
++ *    #list-cells = <2>;
++ *  };
++ *
++ *  phandle2: node2 {
++ *    #list-cells = <1>;
++ *  };
++ *
++ *  node3 {
++ *    list = <&phandle1 1 2 &phandle2 3>;
++ *  };
++ *
++ * To get a device_node of the ``node2`` node you may call this:
++ * of_parse_phandle_with_args(node3, "list", "#list-cells", 1, &args);
++ */
++static inline int of_parse_phandle_with_args(const struct device_node *np,
++                                           const char *list_name,
++                                           const char *cells_name,
++                                           int index,
++                                           struct of_phandle_args *out_args)
++{
++      int cell_count = -1;
++
++      /* If cells_name is NULL we assume a cell count of 0 */
++      if (!cells_name)
++              cell_count = 0;
++
++      return __of_parse_phandle_with_args(np, list_name, cells_name,
++                                          cell_count, index, out_args);
++}
++
++/**
++ * of_parse_phandle_with_fixed_args() - Find a node pointed by phandle in a list
++ * @np:               pointer to a device tree node containing a list
++ * @list_name:        property name that contains a list
++ * @cell_count: number of argument cells following the phandle
++ * @index:    index of a phandle to parse out
++ * @out_args: optional pointer to output arguments structure (will be filled)
++ *
++ * This function is useful to parse lists of phandles and their arguments.
++ * Returns 0 on success and fills out_args, on error returns appropriate
++ * errno value.
++ *
++ * Caller is responsible to call of_node_put() on the returned out_args->np
++ * pointer.
++ *
++ * Example::
++ *
++ *  phandle1: node1 {
++ *  };
++ *
++ *  phandle2: node2 {
++ *  };
++ *
++ *  node3 {
++ *    list = <&phandle1 0 2 &phandle2 2 3>;
++ *  };
++ *
++ * To get a device_node of the ``node2`` node you may call this:
++ * of_parse_phandle_with_fixed_args(node3, "list", 2, 1, &args);
++ */
++static inline int of_parse_phandle_with_fixed_args(const struct device_node *np,
++                                                 const char *list_name,
++                                                 int cell_count,
++                                                 int index,
++                                                 struct of_phandle_args *out_args)
++{
++      return __of_parse_phandle_with_args(np, list_name, NULL, cell_count,
++                                          index, out_args);
++}
++
++/**
+  * of_property_count_u8_elems - Count the number of u8 elements in a property
+  *
+  * @np:               device node from which the property value is to be read.
diff --git a/target/linux/generic/backport-5.15/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch b/target/linux/generic/backport-5.15/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch
new file mode 100644 (file)
index 0000000..b829f21
--- /dev/null
@@ -0,0 +1,56 @@
+From 8eddceb280f5deb8046fcb660de9f9f683b408b9 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael@walle.cc>
+Date: Tue, 6 Dec 2022 21:07:21 +0100
+Subject: [PATCH] of: base: add of_parse_phandle_with_optional_args()
+
+Add a new variant of the of_parse_phandle_with_args() which treats the
+cells name as optional. If it's missing, it is assumed that the phandle
+has no arguments.
+
+Up until now, a nvmem node didn't have any arguments, so all the device
+trees haven't any '#*-cells' property. But there is a need for an
+additional argument for the phandle, for which we need a '#*-cells'
+property. Therefore, we need to support nvmem nodes with and without
+this property.
+
+Signed-off-by: Michael Walle <michael@walle.cc>
+Reviewed-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+---
+ include/linux/of.h | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -1169,6 +1169,31 @@ static inline int of_parse_phandle_with_
+ }
+ /**
++ * of_parse_phandle_with_optional_args() - Find a node pointed by phandle in a list
++ * @np:               pointer to a device tree node containing a list
++ * @list_name:        property name that contains a list
++ * @cells_name:       property name that specifies phandles' arguments count
++ * @index:    index of a phandle to parse out
++ * @out_args: optional pointer to output arguments structure (will be filled)
++ *
++ * Same as of_parse_phandle_with_args() except that if the cells_name property
++ * is not found, cell_count of 0 is assumed.
++ *
++ * This is used to useful, if you have a phandle which didn't have arguments
++ * before and thus doesn't have a '#*-cells' property but is now migrated to
++ * having arguments while retaining backwards compatibility.
++ */
++static inline int of_parse_phandle_with_optional_args(const struct device_node *np,
++                                                    const char *list_name,
++                                                    const char *cells_name,
++                                                    int index,
++                                                    struct of_phandle_args *out_args)
++{
++      return __of_parse_phandle_with_args(np, list_name, cells_name,
++                                          0, index, out_args);
++}
++
++/**
+  * of_property_count_u8_elems - Count the number of u8 elements in a property
+  *
+  * @np:               device node from which the property value is to be read.
diff --git a/target/linux/generic/backport-5.15/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch b/target/linux/generic/backport-5.15/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch
new file mode 100644 (file)
index 0000000..4cf11ca
--- /dev/null
@@ -0,0 +1,32 @@
+From 4f4145c9fee8c7a445dbbbadceccce5391e6b287 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael@walle.cc>
+Date: Tue, 6 Dec 2022 21:07:22 +0100
+Subject: [PATCH] of: property: make #.*-cells optional for simple props
+
+Sometimes, future bindings for phandles will get additional arguments.
+Thus the target node of the phandle will need a new #.*-cells property.
+To be backwards compatible, this needs to be optional.
+
+Prepare the DEFINE_SIMPLE_PROPS() to handle the cells name as optional.
+
+Signed-off-by: Michael Walle <michael@walle.cc>
+Tested-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Reviewed-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+---
+ drivers/of/property.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/of/property.c
++++ b/drivers/of/property.c
+@@ -1227,8 +1227,8 @@ static struct device_node *parse_suffix_
+       if (strcmp_suffix(prop_name, suffix))
+               return NULL;
+-      if (of_parse_phandle_with_args(np, prop_name, cells_name, index,
+-                                     &sup_args))
++      if (__of_parse_phandle_with_args(np, prop_name, cells_name, 0, index,
++                                       &sup_args))
+               return NULL;
+       return sup_args.np;
diff --git a/target/linux/generic/backport-5.15/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch b/target/linux/generic/backport-5.15/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch
new file mode 100644 (file)
index 0000000..8c047e6
--- /dev/null
@@ -0,0 +1,28 @@
+From 9cf9486a6a7e8a3d76154d0c506051ba3740e8b6 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael@walle.cc>
+Date: Tue, 6 Dec 2022 21:07:23 +0100
+Subject: [PATCH] of: property: add #nvmem-cell-cells property
+
+Bindings describe the new '#nvmem-cell-cells' property. Now that the
+arguments count property is optional, we just add this property to the
+nvmem-cells.
+
+Signed-off-by: Michael Walle <michael@walle.cc>
+Tested-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Reviewed-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+---
+ drivers/of/property.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/of/property.c
++++ b/drivers/of/property.c
+@@ -1276,7 +1276,7 @@ DEFINE_SIMPLE_PROP(dmas, "dmas", "#dma-c
+ DEFINE_SIMPLE_PROP(power_domains, "power-domains", "#power-domain-cells")
+ DEFINE_SIMPLE_PROP(hwlocks, "hwlocks", "#hwlock-cells")
+ DEFINE_SIMPLE_PROP(extcon, "extcon", NULL)
+-DEFINE_SIMPLE_PROP(nvmem_cells, "nvmem-cells", NULL)
++DEFINE_SIMPLE_PROP(nvmem_cells, "nvmem-cells", "#nvmem-cell-cells")
+ DEFINE_SIMPLE_PROP(phys, "phys", "#phy-cells")
+ DEFINE_SIMPLE_PROP(wakeup_parent, "wakeup-parent", NULL)
+ DEFINE_SIMPLE_PROP(pinctrl0, "pinctrl-0", NULL)
index 17d3f2ffd59609cd7a0004fcf4bd3d2ebefadca5..dbba45b41c3b3a87c3644971f46b6ff8a319fa3f 100644 (file)
@@ -16,7 +16,7 @@ SVN-Revision: 36780
 
 --- a/drivers/of/fdt.c
 +++ b/drivers/of/fdt.c
-@@ -1055,6 +1055,9 @@ int __init early_init_dt_scan_chosen(uns
+@@ -1054,6 +1054,9 @@ int __init early_init_dt_scan_chosen(uns
        p = of_get_flat_dt_prop(node, "bootargs", &l);
        if (p != NULL && l > 0)
                strlcpy(data, p, min(l, COMMAND_LINE_SIZE));
index ddc3b7cb5279b1ec65d0585f12cd6730dd9a8b42..3f433289617eabcec043d5e6fcabac4a37954b2b 100644 (file)
@@ -17,7 +17,7 @@
        default ""
 --- a/drivers/of/fdt.c
 +++ b/drivers/of/fdt.c
-@@ -1059,6 +1059,17 @@ int __init early_init_dt_scan_chosen(uns
+@@ -1058,6 +1058,17 @@ int __init early_init_dt_scan_chosen(uns
        if (p != NULL && l > 0)
                strlcat(data, p, min_t(int, strlen(data) + (int)l, COMMAND_LINE_SIZE));
  
index 9242fce4e2150de8d9db2c051be25558628ce222..95ce5f2bb914a690e73c809b4ec21468281b57f7 100644 (file)
@@ -17,7 +17,7 @@
        help
 --- a/drivers/of/fdt.c
 +++ b/drivers/of/fdt.c
-@@ -1059,6 +1059,17 @@ int __init early_init_dt_scan_chosen(uns
+@@ -1058,6 +1058,17 @@ int __init early_init_dt_scan_chosen(uns
        if (p != NULL && l > 0)
                strlcat(data, p, min_t(int, strlen(data) + (int)l, COMMAND_LINE_SIZE));