Thread (7 messages) flat view 7 messages, 4 authors, 2021-03-08

Re: [PATCH stblinux.git 2/2] firmware: bcm47xx_nvram: support platform device "brcm,nvram"

From: Florian Fainelli <f.fainelli@gmail.com>
Date: 2021-03-02 19:58:37
Also in: linux-devicetree, linux-mips, lkml

On 3/1/21 11:44 PM, Rafał Miłecki wrote:
From: Rafał Miłecki <rafal@milecki.pl>

Add support for platform device providing mapping resource. This allows
reading NVRAM based on DT mapping binding. It's required for devices
that boot depending on NVRAM stored setup and provides early access to
NVRAM data.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
bcm47xx_nvram driver was originally added through MIPS tree, but this
change doesn't affect BCM47XX (MIPS) as it doesn't use DT. It targets
ARCH_BCM_5301X so I suggest this goes through the stblinux.git tree.
Can you see if this change can be replaced by the nvmem-rmem work that
Nicolas recently did to support something similar for the Raspberry Pi 4:

https://lkml.org/lkml/2021/1/29/235
quoted hunk ↗ jump to hunk
---
 drivers/firmware/broadcom/bcm47xx_nvram.c | 55 +++++++++++++++++++++++
 1 file changed, 55 insertions(+)
diff --git a/drivers/firmware/broadcom/bcm47xx_nvram.c b/drivers/firmware/broadcom/bcm47xx_nvram.c
index 835ece9c00f1..d5d19dd1b9e1 100644
--- a/drivers/firmware/broadcom/bcm47xx_nvram.c
+++ b/drivers/firmware/broadcom/bcm47xx_nvram.c
@@ -13,6 +13,7 @@
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/mtd/mtd.h>
+#include <linux/platform_device.h>
 #include <linux/bcm47xx_nvram.h>
 
 #define NVRAM_MAGIC			0x48534C46	/* 'FLSH' */
@@ -162,6 +163,60 @@ static int nvram_init(void)
 	return -ENXIO;
 }
 
+static int brcm_nvram_probe(struct platform_device *pdev)
+{
+	struct nvram_header __iomem *header;
+	struct device *dev = &pdev->dev;
+	struct resource *res;
+	void __iomem *mmio;
+	size_t copy_len;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res) {
+		dev_err(dev, "Failed to get resource\n");
+		return -ENODEV;
+	}
+
+	mmio = ioremap(res->start, resource_size(res));
+	if (!mmio)
+		return -ENOMEM;
+
+	header = (struct nvram_header *)mmio;
+	copy_len = DIV_ROUND_UP(sizeof(*header) + header->len, 4);
+	if (header->magic != NVRAM_MAGIC) {
+		dev_err(dev, "No NVRAM found at %pR\n", res);
+		return -EPROTO;
+	} else if (copy_len > resource_size(res)) {
+		dev_err(dev, "NVRAM size exceeds %pR\n", res);
+		return -ERANGE;
+	} else if (copy_len >= NVRAM_SPACE) {
+		dev_err(dev, "NVRAM size exceeds buffer size %d\n", NVRAM_SPACE);
+		return -ENOMEM;
+	}
+
+	__ioread32_copy(nvram_buf, mmio, copy_len);
+	nvram_buf[NVRAM_SPACE - 1] = '\0';
+
+	iounmap(mmio);
+
+	return 0;
+}
+
+static const struct of_device_id brcm_nvram_of_match[] = {
+	{ .compatible = "brcm,nvram "},
+	{},
+};
+
+static struct platform_driver brcm_nvram_driver = {
+	.driver = {
+		.name = "brcm_nvram",
+		.of_match_table = brcm_nvram_of_match,
+	},
+	.probe	= brcm_nvram_probe,
+};
+
+module_platform_driver(brcm_nvram_driver);
+
 int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len)
 {
 	char *var, *value, *end, *eq;

-- 
Florian

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help