All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Walle <michael@walle.cc>
To: ath9k-devel@qca.qualcomm.com, UNGLinuxDriver@microchip.com,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	netdev@vger.kernel.org, linux-mediatek@lists.infradead.org,
	linux-renesas-soc@vger.kernel.org,
	linux-stm32@st-md-mailman.stormreply.com,
	linux-amlogic@lists.infradead.org, linux-oxnas@groups.io,
	linux-omap@vger.kernel.org, linux-wireless@vger.kernel.org,
	devicetree@vger.kernel.org, linux-staging@lists.linux.dev
Cc: "Andrew Lunn" <andrew@lunn.ch>,
	"Gregory Clement" <gregory.clement@bootlin.com>,
	"Sebastian Hesselbarth" <sebastian.hesselbarth@gmail.com>,
	"Russell King" <linux@armlinux.org.uk>,
	"Michael Ellerman" <mpe@ellerman.id.au>,
	"Benjamin Herrenschmidt" <benh@kernel.crashing.org>,
	"Paul Mackerras" <paulus@samba.org>,
	"Andreas Larsson" <andreas@gaisler.com>,
	"David S . Miller" <davem@davemloft.net>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Chen-Yu Tsai" <wens@csie.org>,
	"Jernej Skrabec" <jernej.skrabec@siol.net>,
	"Joyce Ooi" <joyce.ooi@intel.com>,
	"Chris Snook" <chris.snook@gmail.com>,
	"Rafał Miłecki" <rafal@milecki.pl>,
	bcm-kernel-feedback-list@broadcom.com,
	"Florian Fainelli" <f.fainelli@gmail.com>,
	"Nicolas Ferre" <nicolas.ferre@microchip.com>,
	"Claudiu Beznea" <claudiu.beznea@microchip.com>,
	"Sunil Goutham" <sgoutham@marvell.com>,
	"Fugang Duan" <fugang.duan@nxp.com>,
	"Madalin Bucur" <madalin.bucur@nxp.com>,
	"Pantelis Antoniou" <pantelis.antoniou@gmail.com>,
	"Claudiu Manoil" <claudiu.manoil@nxp.com>,
	"Li Yang" <leoyang.li@nxp.com>,
	"Yisen Zhuang" <yisen.zhuang@huawei.com>,
	"Salil Mehta" <salil.mehta@huawei.com>,
	"Hauke Mehrtens" <hauke@hauke-m.de>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
	"Vadym Kochan" <vkochan@marvell.com>,
	"Taras Chornyi" <tchornyi@marvell.com>,
	"Mirko Lindner" <mlindner@marvell.com>,
	"Stephen Hemminger" <stephen@networkplumber.org>,
	"Felix Fietkau" <nbd@nbd.name>, "John Crispin" <john@phrozen.org>,
	"Sean Wang" <sean.wang@mediatek.com>,
	"Mark Lee" <Mark-MC.Lee@mediatek.com>,
	"Matthias Brugger" <matthias.bgg@gmail.com>,
	"Bryan Whitehead" <bryan.whitehead@microchip.com>,
	"Vladimir Zapolskiy" <vz@mleia.com>,
	"Sergei Shtylyov" <sergei.shtylyov@gmail.com>,
	"Byungho An" <bh74.an@samsung.com>,
	"Kunihiko Hayashi" <hayashi.kunihiko@socionext.com>,
	"Giuseppe Cavallaro" <peppe.cavallaro@st.com>,
	"Alexandre Torgue" <alexandre.torgue@st.com>,
	"Jose Abreu" <joabreu@synopsys.com>,
	"Maxime Coquelin" <mcoquelin.stm32@gmail.com>,
	"Shawn Guo" <shawnguo@kernel.org>,
	"Sascha Hauer" <s.hauer@pengutronix.de>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Fabio Estevam" <festevam@gmail.com>,
	"NXP Linux Team" <linux-imx@nxp.com>,
	"Kevin Hilman" <khilman@baylibre.com>,
	"Neil Armstrong" <narmstrong@baylibre.com>,
	"Jerome Brunet" <jbrunet@baylibre.com>,
	"Martin Blumenstingl" <martin.blumenstingl@googlemail.com>,
	"Vinod Koul" <vkoul@kernel.org>,
	"Nobuhiro Iwamatsu" <nobuhiro1.iwamatsu@toshiba.co.jp>,
	"Grygorii Strashko" <grygorii.strashko@ti.com>,
	"Wingman Kwok" <w-kwok2@ti.com>,
	"Murali Karicheri" <m-karicheri2@ti.com>,
	"Michal Simek" <michal.simek@xilinx.com>,
	"Radhey Shyam Pandey" <radhey.shyam.pandey@xilinx.com>,
	"Kalle Valo" <kvalo@codeaurora.org>,
	"Lorenzo Bianconi" <lorenzo.bianconi83@gmail.com>,
	"Ryder Lee" <ryder.lee@mediatek.com>,
	"Stanislaw Gruszka" <stf_xl@wp.pl>,
	"Helmut Schaa" <helmut.schaa@googlemail.com>,
	"Heiner Kallweit" <hkallweit1@gmail.com>,
	"Rob Herring" <robh+dt@kernel.org>,
	"Frank Rowand" <frowand.list@gmail.com>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Jérôme Pouiller" <jerome.pouiller@silabs.com>,
	"Vivien Didelot" <vivien.didelot@gmail.com>,
	"Vladimir Oltean" <olteanv@gmail.com>,
	"Michael Walle" <michael@walle.cc>
Subject: [PATCH net-next v3 2/2] of: net: fix of_get_mac_addr_nvmem() for PCI and DSA nodes
Date: Wed,  7 Apr 2021 00:09:21 +0200	[thread overview]
Message-ID: <20210406220921.24313-3-michael@walle.cc> (raw)
In-Reply-To: <20210406220921.24313-1-michael@walle.cc>

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>
---
Please note, that I've kept the nvmem_get_mac_address() which operates
on a device. The new of_get_mac_addr_nvmem() is almost identical and
there are no users of the former function right now, but it seems to be
the "newer" version to get the MAC address for a "struct device". Thus
I've kept it. Please advise, if I should kill it though.

 drivers/of/of_net.c | 35 ++++++++++++++++++++++++++++++-----
 1 file changed, 30 insertions(+), 5 deletions(-)

diff --git a/drivers/of/of_net.c b/drivers/of/of_net.c
index 2d5d5e59aea5..2323c6063eaf 100644
--- 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_node *np, const char *name, u8 *addr)
 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);
+	ether_addr_copy(addr, mac);
+	kfree(mac);
 
-	return ret;
+	return 0;
 }
 
 /**
-- 
2.20.1


WARNING: multiple messages have this Message-ID (diff)
From: Michael Walle <michael@walle.cc>
To: ath9k-devel@qca.qualcomm.com, UNGLinuxDriver@microchip.com,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	netdev@vger.kernel.org, linux-mediatek@lists.infradead.org,
	linux-renesas-soc@vger.kernel.org,
	linux-stm32@st-md-mailman.stormreply.com,
	linux-amlogic@lists.infradead.org, linux-oxnas@groups.io,
	linux-omap@vger.kernel.org, linux-wireless@vger.kernel.org,
	devicetree@vger.kernel.org, linux-staging@lists.linux.dev
Cc: "Andrew Lunn" <andrew@lunn.ch>,
	"Jérôme Pouiller" <jerome.pouiller@silabs.com>,
	"Kunihiko Hayashi" <hayashi.kunihiko@socionext.com>,
	"Andreas Larsson" <andreas@gaisler.com>,
	"Rob Herring" <robh+dt@kernel.org>,
	"Michal Simek" <michal.simek@xilinx.com>,
	"Lorenzo Bianconi" <lorenzo.bianconi83@gmail.com>,
	"Paul Mackerras" <paulus@samba.org>,
	"Michael Walle" <michael@walle.cc>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
	"Rafał Miłecki" <rafal@milecki.pl>,
	"Nobuhiro Iwamatsu" <nobuhiro1.iwamatsu@toshiba.co.jp>,
	"Li Yang" <leoyang.li@nxp.com>,
	"Fabio Estevam" <festevam@gmail.com>,
	"Jerome Brunet" <jbrunet@baylibre.com>,
	"Stephen Hemminger" <stephen@networkplumber.org>,
	"Florian Fainelli" <f.fainelli@gmail.com>,
	"Frank Rowand" <frowand.list@gmail.com>,
	"Vivien Didelot" <vivien.didelot@gmail.com>,
	"Gregory Clement" <gregory.clement@bootlin.com>,
	"Madalin Bucur" <madalin.bucur@nxp.com>,
	"Russell King" <linux@armlinux.org.uk>,
	"Neil Armstrong" <narmstrong@baylibre.com>,
	"Wingman Kwok" <w-kwok2@ti.com>, "Chen-Yu Tsai" <wens@csie.org>,
	"Jose Abreu" <joabreu@synopsys.com>,
	bcm-kernel-feedback-list@broadcom.com,
	"NXP Linux Team" <linux-imx@nxp.com>,
	"Chris Snook" <chris.snook@gmail.com>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Radhey Shyam Pandey" <radhey.shyam.pandey@xilinx.com>,
	"Yisen Zhuang" <yisen.zhuang@huawei.com>,
	"Mark Lee" <Mark-MC.Lee@mediatek.com>,
	"Sunil Goutham" <sgoutham@marvell.com>,
	"Sebastian Hesselbarth" <sebastian.hesselbarth@gmail.com>,
	"Grygorii Strashko" <grygorii.strashko@ti.com>,
	"Byungho An" <bh74.an@samsung.com>,
	"Alexandre Torgue" <alexandre.torgue@st.com>,
	"Stanislaw Gruszka" <stf_xl@wp.pl>,
	"Martin Blumenstingl" <martin.blumenstingl@googlemail.com>,
	"Hauke Mehrtens" <hauke@hauke-m.de>,
	"Sascha Hauer" <s.hauer@pengutronix.de>,
	"Sean Wang" <sean.wang@mediatek.com>,
	"Salil Mehta" <salil.mehta@huawei.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Vladimir Zapolskiy" <vz@mleia.com>,
	"Claudiu Manoil" <claudiu.manoil@nxp.com>,
	"Ryder Lee" <ryder.lee@mediatek.com>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Murali Karicheri" <m-karicheri2@ti.com>,
	"John Crispin" <john@phrozen.org>,
	"Matthias Brugger" <matthias.bgg@gmail.com>,
	"Giuseppe Cavallaro" <peppe.cavallaro@st.com>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Kalle Valo" <kvalo@codeaurora.org>,
	"Mirko Lindner" <mlindner@marvell.com>,
	"Jernej Skrabec" <jernej.skrabec@siol.net>,
	"Vladimir Oltean" <olteanv@gmail.com>,
	"Fugang Duan" <fugang.duan@nxp.com>,
	"Vadym Kochan" <vkochan@marvell.com>,
	"Kevin Hilman" <khilman@baylibre.com>,
	"Bryan Whitehead" <bryan.whitehead@microchip.com>,
	"Helmut Schaa" <helmut.schaa@googlemail.com>,
	"Nicolas Ferre" <nicolas.ferre@microchip.com>,
	"David S . Miller" <davem@davemloft.net>,
	"Taras Chornyi" <tchornyi@marvell.com>,
	"Vinod Koul" <vkoul@kernel.org>,
	"Sergei Shtylyov" <sergei.shtylyov@gmail.com>,
	"Maxime Coquelin" <mcoquelin.stm32@gmail.com>,
	"Joyce Ooi" <joyce.ooi@intel.com>,
	"Heiner Kallweit" <hkallweit1@gmail.com>,
	"Shawn Guo" <shawnguo@kernel.org>,
	"Claudiu Beznea" <claudiu.beznea@microchip.com>,
	"Felix Fietkau" <nbd@nbd.name>
Subject: [PATCH net-next v3 2/2] of: net: fix of_get_mac_addr_nvmem() for PCI and DSA nodes
Date: Wed,  7 Apr 2021 00:09:21 +0200	[thread overview]
Message-ID: <20210406220921.24313-3-michael@walle.cc> (raw)
In-Reply-To: <20210406220921.24313-1-michael@walle.cc>

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>
---
Please note, that I've kept the nvmem_get_mac_address() which operates
on a device. The new of_get_mac_addr_nvmem() is almost identical and
there are no users of the former function right now, but it seems to be
the "newer" version to get the MAC address for a "struct device". Thus
I've kept it. Please advise, if I should kill it though.

 drivers/of/of_net.c | 35 ++++++++++++++++++++++++++++++-----
 1 file changed, 30 insertions(+), 5 deletions(-)

diff --git a/drivers/of/of_net.c b/drivers/of/of_net.c
index 2d5d5e59aea5..2323c6063eaf 100644
--- 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_node *np, const char *name, u8 *addr)
 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);
+	ether_addr_copy(addr, mac);
+	kfree(mac);
 
-	return ret;
+	return 0;
 }
 
 /**
-- 
2.20.1


WARNING: multiple messages have this Message-ID (diff)
From: Michael Walle <michael@walle.cc>
To: ath9k-devel@qca.qualcomm.com, UNGLinuxDriver@microchip.com,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	netdev@vger.kernel.org, linux-mediatek@lists.infradead.org,
	linux-renesas-soc@vger.kernel.org,
	linux-stm32@st-md-mailman.stormreply.com,
	linux-amlogic@lists.infradead.org, linux-oxnas@groups.io,
	linux-omap@vger.kernel.org, linux-wireless@vger.kernel.org,
	devicetree@vger.kernel.org, linux-staging@lists.linux.dev
Cc: "Andrew Lunn" <andrew@lunn.ch>,
	"Gregory Clement" <gregory.clement@bootlin.com>,
	"Sebastian Hesselbarth" <sebastian.hesselbarth@gmail.com>,
	"Russell King" <linux@armlinux.org.uk>,
	"Michael Ellerman" <mpe@ellerman.id.au>,
	"Benjamin Herrenschmidt" <benh@kernel.crashing.org>,
	"Paul Mackerras" <paulus@samba.org>,
	"Andreas Larsson" <andreas@gaisler.com>,
	"David S . Miller" <davem@davemloft.net>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Chen-Yu Tsai" <wens@csie.org>,
	"Jernej Skrabec" <jernej.skrabec@siol.net>,
	"Joyce Ooi" <joyce.ooi@intel.com>,
	"Chris Snook" <chris.snook@gmail.com>,
	"Rafał Miłecki" <rafal@milecki.pl>,
	bcm-kernel-feedback-list@broadcom.com,
	"Florian Fainelli" <f.fainelli@gmail.com>,
	"Nicolas Ferre" <nicolas.ferre@microchip.com>,
	"Claudiu Beznea" <claudiu.beznea@microchip.com>,
	"Sunil Goutham" <sgoutham@marvell.com>,
	"Fugang Duan" <fugang.duan@nxp.com>,
	"Madalin Bucur" <madalin.bucur@nxp.com>,
	"Pantelis Antoniou" <pantelis.antoniou@gmail.com>,
	"Claudiu Manoil" <claudiu.manoil@nxp.com>,
	"Li Yang" <leoyang.li@nxp.com>,
	"Yisen Zhuang" <yisen.zhuang@huawei.com>,
	"Salil Mehta" <salil.mehta@huawei.com>,
	"Hauke Mehrtens" <hauke@hauke-m.de>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
	"Vadym Kochan" <vkochan@marvell.com>,
	"Taras Chornyi" <tchornyi@marvell.com>,
	"Mirko Lindner" <mlindner@marvell.com>,
	"Stephen Hemminger" <stephen@networkplumber.org>,
	"Felix Fietkau" <nbd@nbd.name>, "John Crispin" <john@phrozen.org>,
	"Sean Wang" <sean.wang@mediatek.com>,
	"Mark Lee" <Mark-MC.Lee@mediatek.com>,
	"Matthias Brugger" <matthias.bgg@gmail.com>,
	"Bryan Whitehead" <bryan.whitehead@microchip.com>,
	"Vladimir Zapolskiy" <vz@mleia.com>,
	"Sergei Shtylyov" <sergei.shtylyov@gmail.com>,
	"Byungho An" <bh74.an@samsung.com>,
	"Kunihiko Hayashi" <hayashi.kunihiko@socionext.com>,
	"Giuseppe Cavallaro" <peppe.cavallaro@st.com>,
	"Alexandre Torgue" <alexandre.torgue@st.com>,
	"Jose Abreu" <joabreu@synopsys.com>,
	"Maxime Coquelin" <mcoquelin.stm32@gmail.com>,
	"Shawn Guo" <shawnguo@kernel.org>,
	"Sascha Hauer" <s.hauer@pengutronix.de>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Fabio Estevam" <festevam@gmail.com>,
	"NXP Linux Team" <linux-imx@nxp.com>,
	"Kevin Hilman" <khilman@baylibre.com>,
	"Neil Armstrong" <narmstrong@baylibre.com>,
	"Jerome Brunet" <jbrunet@baylibre.com>,
	"Martin Blumenstingl" <martin.blumenstingl@googlemail.com>,
	"Vinod Koul" <vkoul@kernel.org>,
	"Nobuhiro Iwamatsu" <nobuhiro1.iwamatsu@toshiba.co.jp>,
	"Grygorii Strashko" <grygorii.strashko@ti.com>,
	"Wingman Kwok" <w-kwok2@ti.com>,
	"Murali Karicheri" <m-karicheri2@ti.com>,
	"Michal Simek" <michal.simek@xilinx.com>,
	"Radhey Shyam Pandey" <radhey.shyam.pandey@xilinx.com>,
	"Kalle Valo" <kvalo@codeaurora.org>,
	"Lorenzo Bianconi" <lorenzo.bianconi83@gmail.com>,
	"Ryder Lee" <ryder.lee@mediatek.com>,
	"Stanislaw Gruszka" <stf_xl@wp.pl>,
	"Helmut Schaa" <helmut.schaa@googlemail.com>,
	"Heiner Kallweit" <hkallweit1@gmail.com>,
	"Rob Herring" <robh+dt@kernel.org>,
	"Frank Rowand" <frowand.list@gmail.com>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Jérôme Pouiller" <jerome.pouiller@silabs.com>,
	"Vivien Didelot" <vivien.didelot@gmail.com>,
	"Vladimir Oltean" <olteanv@gmail.com>,
	"Michael Walle" <michael@walle.cc>
Subject: [PATCH net-next v3 2/2] of: net: fix of_get_mac_addr_nvmem() for PCI and DSA nodes
Date: Wed,  7 Apr 2021 00:09:21 +0200	[thread overview]
Message-ID: <20210406220921.24313-3-michael@walle.cc> (raw)
In-Reply-To: <20210406220921.24313-1-michael@walle.cc>

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>
---
Please note, that I've kept the nvmem_get_mac_address() which operates
on a device. The new of_get_mac_addr_nvmem() is almost identical and
there are no users of the former function right now, but it seems to be
the "newer" version to get the MAC address for a "struct device". Thus
I've kept it. Please advise, if I should kill it though.

 drivers/of/of_net.c | 35 ++++++++++++++++++++++++++++++-----
 1 file changed, 30 insertions(+), 5 deletions(-)

diff --git a/drivers/of/of_net.c b/drivers/of/of_net.c
index 2d5d5e59aea5..2323c6063eaf 100644
--- 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_node *np, const char *name, u8 *addr)
 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);
+	ether_addr_copy(addr, mac);
+	kfree(mac);
 
-	return ret;
+	return 0;
 }
 
 /**
-- 
2.20.1


_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

WARNING: multiple messages have this Message-ID (diff)
From: Michael Walle <michael@walle.cc>
To: ath9k-devel@qca.qualcomm.com, UNGLinuxDriver@microchip.com,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	netdev@vger.kernel.org, linux-mediatek@lists.infradead.org,
	linux-renesas-soc@vger.kernel.org,
	linux-stm32@st-md-mailman.stormreply.com,
	linux-amlogic@lists.infradead.org, linux-oxnas@groups.io,
	linux-omap@vger.kernel.org, linux-wireless@vger.kernel.org,
	devicetree@vger.kernel.org, linux-staging@lists.linux.dev
Cc: "Andrew Lunn" <andrew@lunn.ch>,
	"Gregory Clement" <gregory.clement@bootlin.com>,
	"Sebastian Hesselbarth" <sebastian.hesselbarth@gmail.com>,
	"Russell King" <linux@armlinux.org.uk>,
	"Michael Ellerman" <mpe@ellerman.id.au>,
	"Benjamin Herrenschmidt" <benh@kernel.crashing.org>,
	"Paul Mackerras" <paulus@samba.org>,
	"Andreas Larsson" <andreas@gaisler.com>,
	"David S . Miller" <davem@davemloft.net>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Chen-Yu Tsai" <wens@csie.org>,
	"Jernej Skrabec" <jernej.skrabec@siol.net>,
	"Joyce Ooi" <joyce.ooi@intel.com>,
	"Chris Snook" <chris.snook@gmail.com>,
	"Rafał Miłecki" <rafal@milecki.pl>,
	bcm-kernel-feedback-list@broadcom.com,
	"Florian Fainelli" <f.fainelli@gmail.com>,
	"Nicolas Ferre" <nicolas.ferre@microchip.com>,
	"Claudiu Beznea" <claudiu.beznea@microchip.com>,
	"Sunil Goutham" <sgoutham@marvell.com>,
	"Fugang Duan" <fugang.duan@nxp.com>,
	"Madalin Bucur" <madalin.bucur@nxp.com>,
	"Pantelis Antoniou" <pantelis.antoniou@gmail.com>,
	"Claudiu Manoil" <claudiu.manoil@nxp.com>,
	"Li Yang" <leoyang.li@nxp.com>,
	"Yisen Zhuang" <yisen.zhuang@huawei.com>,
	"Salil Mehta" <salil.mehta@huawei.com>,
	"Hauke Mehrtens" <hauke@hauke-m.de>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
	"Vadym Kochan" <vkochan@marvell.com>,
	"Taras Chornyi" <tchornyi@marvell.com>,
	"Mirko Lindner" <mlindner@marvell.com>,
	"Stephen Hemminger" <stephen@networkplumber.org>,
	"Felix Fietkau" <nbd@nbd.name>, "John Crispin" <john@phrozen.org>,
	"Sean Wang" <sean.wang@mediatek.com>,
	"Mark Lee" <Mark-MC.Lee@mediatek.com>,
	"Matthias Brugger" <matthias.bgg@gmail.com>,
	"Bryan Whitehead" <bryan.whitehead@microchip.com>,
	"Vladimir Zapolskiy" <vz@mleia.com>,
	"Sergei Shtylyov" <sergei.shtylyov@gmail.com>,
	"Byungho An" <bh74.an@samsung.com>,
	"Kunihiko Hayashi" <hayashi.kunihiko@socionext.com>,
	"Giuseppe Cavallaro" <peppe.cavallaro@st.com>,
	"Alexandre Torgue" <alexandre.torgue@st.com>,
	"Jose Abreu" <joabreu@synopsys.com>,
	"Maxime Coquelin" <mcoquelin.stm32@gmail.com>,
	"Shawn Guo" <shawnguo@kernel.org>,
	"Sascha Hauer" <s.hauer@pengutronix.de>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Fabio Estevam" <festevam@gmail.com>,
	"NXP Linux Team" <linux-imx@nxp.com>,
	"Kevin Hilman" <khilman@baylibre.com>,
	"Neil Armstrong" <narmstrong@baylibre.com>,
	"Jerome Brunet" <jbrunet@baylibre.com>,
	"Martin Blumenstingl" <martin.blumenstingl@googlemail.com>,
	"Vinod Koul" <vkoul@kernel.org>,
	"Nobuhiro Iwamatsu" <nobuhiro1.iwamatsu@toshiba.co.jp>,
	"Grygorii Strashko" <grygorii.strashko@ti.com>,
	"Wingman Kwok" <w-kwok2@ti.com>,
	"Murali Karicheri" <m-karicheri2@ti.com>,
	"Michal Simek" <michal.simek@xilinx.com>,
	"Radhey Shyam Pandey" <radhey.shyam.pandey@xilinx.com>,
	"Kalle Valo" <kvalo@codeaurora.org>,
	"Lorenzo Bianconi" <lorenzo.bianconi83@gmail.com>,
	"Ryder Lee" <ryder.lee@mediatek.com>,
	"Stanislaw Gruszka" <stf_xl@wp.pl>,
	"Helmut Schaa" <helmut.schaa@googlemail.com>,
	"Heiner Kallweit" <hkallweit1@gmail.com>,
	"Rob Herring" <robh+dt@kernel.org>,
	"Frank Rowand" <frowand.list@gmail.com>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Jérôme Pouiller" <jerome.pouiller@silabs.com>,
	"Vivien Didelot" <vivien.didelot@gmail.com>,
	"Vladimir Oltean" <olteanv@gmail.com>,
	"Michael Walle" <michael@walle.cc>
Subject: [PATCH net-next v3 2/2] of: net: fix of_get_mac_addr_nvmem() for PCI and DSA nodes
Date: Wed,  7 Apr 2021 00:09:21 +0200	[thread overview]
Message-ID: <20210406220921.24313-3-michael@walle.cc> (raw)
In-Reply-To: <20210406220921.24313-1-michael@walle.cc>

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>
---
Please note, that I've kept the nvmem_get_mac_address() which operates
on a device. The new of_get_mac_addr_nvmem() is almost identical and
there are no users of the former function right now, but it seems to be
the "newer" version to get the MAC address for a "struct device". Thus
I've kept it. Please advise, if I should kill it though.

 drivers/of/of_net.c | 35 ++++++++++++++++++++++++++++++-----
 1 file changed, 30 insertions(+), 5 deletions(-)

diff --git a/drivers/of/of_net.c b/drivers/of/of_net.c
index 2d5d5e59aea5..2323c6063eaf 100644
--- 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_node *np, const char *name, u8 *addr)
 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);
+	ether_addr_copy(addr, mac);
+	kfree(mac);
 
-	return ret;
+	return 0;
 }
 
 /**
-- 
2.20.1


_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic

  parent reply	other threads:[~2021-04-06 22:09 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-06 22:09 [PATCH net-next v3 0/2] of: net: support non-platform devices in of_get_mac_address() Michael Walle
2021-04-06 22:09 ` Michael Walle
2021-04-06 22:09 ` Michael Walle
2021-04-06 22:09 ` Michael Walle
2021-04-06 22:09 ` [PATCH net-next v3 1/2] of: net: pass the dst buffer to of_get_mac_address() Michael Walle
2021-04-06 22:09   ` Michael Walle
2021-04-06 22:09   ` Michael Walle
2021-04-06 22:09   ` Michael Walle
2021-04-07 16:10   ` Michael Walle
2021-04-07 16:10     ` Michael Walle
2021-04-07 16:10     ` Michael Walle
2021-04-07 16:10     ` Michael Walle
2021-04-06 22:09 ` Michael Walle [this message]
2021-04-06 22:09   ` [PATCH net-next v3 2/2] of: net: fix of_get_mac_addr_nvmem() for PCI and DSA nodes Michael Walle
2021-04-06 22:09   ` Michael Walle
2021-04-06 22:09   ` Michael Walle
2021-04-07  1:45   ` Florian Fainelli
2021-04-07  1:45     ` Florian Fainelli
2021-04-07  1:45     ` Florian Fainelli
2021-04-07  1:45     ` Florian Fainelli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210406220921.24313-3-michael@walle.cc \
    --to=michael@walle.cc \
    --cc=Mark-MC.Lee@mediatek.com \
    --cc=UNGLinuxDriver@microchip.com \
    --cc=alexandre.torgue@st.com \
    --cc=andreas@gaisler.com \
    --cc=andrew@lunn.ch \
    --cc=ath9k-devel@qca.qualcomm.com \
    --cc=bcm-kernel-feedback-list@broadcom.com \
    --cc=benh@kernel.crashing.org \
    --cc=bh74.an@samsung.com \
    --cc=bryan.whitehead@microchip.com \
    --cc=chris.snook@gmail.com \
    --cc=claudiu.beznea@microchip.com \
    --cc=claudiu.manoil@nxp.com \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=f.fainelli@gmail.com \
    --cc=festevam@gmail.com \
    --cc=frowand.list@gmail.com \
    --cc=fugang.duan@nxp.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=gregory.clement@bootlin.com \
    --cc=grygorii.strashko@ti.com \
    --cc=hauke@hauke-m.de \
    --cc=hayashi.kunihiko@socionext.com \
    --cc=helmut.schaa@googlemail.com \
    --cc=hkallweit1@gmail.com \
    --cc=jbrunet@baylibre.com \
    --cc=jernej.skrabec@siol.net \
    --cc=jerome.pouiller@silabs.com \
    --cc=joabreu@synopsys.com \
    --cc=john@phrozen.org \
    --cc=joyce.ooi@intel.com \
    --cc=kernel@pengutronix.de \
    --cc=khilman@baylibre.com \
    --cc=kuba@kernel.org \
    --cc=kvalo@codeaurora.org \
    --cc=leoyang.li@nxp.com \
    --cc=linux-amlogic@lists.infradead.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-imx@nxp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-oxnas@groups.io \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=linux-staging@lists.linux.dev \
    --cc=linux-stm32@st-md-mailman.stormreply.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=lorenzo.bianconi83@gmail.com \
    --cc=m-karicheri2@ti.com \
    --cc=madalin.bucur@nxp.com \
    --cc=martin.blumenstingl@googlemail.com \
    --cc=matthias.bgg@gmail.com \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=michal.simek@xilinx.com \
    --cc=mlindner@marvell.com \
    --cc=mpe@ellerman.id.au \
    --cc=mripard@kernel.org \
    --cc=narmstrong@baylibre.com \
    --cc=nbd@nbd.name \
    --cc=netdev@vger.kernel.org \
    --cc=nicolas.ferre@microchip.com \
    --cc=nobuhiro1.iwamatsu@toshiba.co.jp \
    --cc=olteanv@gmail.com \
    --cc=pantelis.antoniou@gmail.com \
    --cc=paulus@samba.org \
    --cc=peppe.cavallaro@st.com \
    --cc=radhey.shyam.pandey@xilinx.com \
    --cc=rafal@milecki.pl \
    --cc=robh+dt@kernel.org \
    --cc=ryder.lee@mediatek.com \
    --cc=s.hauer@pengutronix.de \
    --cc=salil.mehta@huawei.com \
    --cc=sean.wang@mediatek.com \
    --cc=sebastian.hesselbarth@gmail.com \
    --cc=sergei.shtylyov@gmail.com \
    --cc=sgoutham@marvell.com \
    --cc=shawnguo@kernel.org \
    --cc=stephen@networkplumber.org \
    --cc=stf_xl@wp.pl \
    --cc=tchornyi@marvell.com \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=vivien.didelot@gmail.com \
    --cc=vkochan@marvell.com \
    --cc=vkoul@kernel.org \
    --cc=vz@mleia.com \
    --cc=w-kwok2@ti.com \
    --cc=wens@csie.org \
    --cc=yisen.zhuang@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.