2021-03-05 18:40:58

by Rafał Miłecki

[permalink] [raw]
Subject: [PATCH V2 1/2] dt-bindings: nvmem: add Broadcom's NVRAM

From: Rafał Miłecki <[email protected]>

Broadcom's NVRAM structure contains device data and can be accessed
using I/O mapping.

Signed-off-by: Rafał Miłecki <[email protected]>
---
V2: Use Broadcom's NVRAM specific binding. Generic "nvmem-iomap" binding
didn't make much sense. Thanks Srinivas!
---
.../devicetree/bindings/nvmem/brcm,nvram.yaml | 34 +++++++++++++++++++
1 file changed, 34 insertions(+)
create mode 100644 Documentation/devicetree/bindings/nvmem/brcm,nvram.yaml

diff --git a/Documentation/devicetree/bindings/nvmem/brcm,nvram.yaml b/Documentation/devicetree/bindings/nvmem/brcm,nvram.yaml
new file mode 100644
index 000000000000..58ff6b0bdb1a
--- /dev/null
+++ b/Documentation/devicetree/bindings/nvmem/brcm,nvram.yaml
@@ -0,0 +1,34 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/nvmem/brcm,nvram.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Broadcom's NVRAM
+
+description: |
+ Broadcom's NVRAM is a structure containing device specific environment
+ variables. It is used for storing device configuration, booting parameters
+ and calibration data.
+
+ NVRAM can be accessed on Broadcom BCM47xx MIPS and Northstar ARM Cortex-A9
+ devices usiong I/O mapped memory.
+
+maintainers:
+ - Rafał Miłecki <[email protected]>
+
+allOf:
+ - $ref: "nvmem.yaml#"
+
+properties:
+ compatible:
+ const: brcm,nvram
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ nvram@1eff0000 {
+ compatible = "brcm,nvram";
+ reg = <0x1eff0000 0x10000>;
+ };
--
2.26.2


2021-03-05 18:40:58

by Rafał Miłecki

[permalink] [raw]
Subject: [PATCH V2 2/2] nvmem: brcm_nvram: new driver exposing Broadcom's NVRAM

From: Rafał Miłecki <[email protected]>

This driver provides access to Broadcom's NVRAM.

Signed-off-by: Rafał Miłecki <[email protected]>
---
V2: Applied Srinivas's suggestions:
* Simplified brcm_nvram_read
* Drop unneeded check & prints from probe
* Fixed MODULE_LICENSE
* Switched to Broadcom specific binding & driver. This is such a trivial
driver that even if we get another similar one, it probably won't be worth
it to share their code.
Thank you Srinivas!
---
drivers/nvmem/Kconfig | 9 +++++
drivers/nvmem/Makefile | 2 +
drivers/nvmem/brcm_nvram.c | 78 ++++++++++++++++++++++++++++++++++++++
3 files changed, 89 insertions(+)
create mode 100644 drivers/nvmem/brcm_nvram.c

diff --git a/drivers/nvmem/Kconfig b/drivers/nvmem/Kconfig
index 75d2594c16e1..d2a848fab82a 100644
--- a/drivers/nvmem/Kconfig
+++ b/drivers/nvmem/Kconfig
@@ -278,4 +278,13 @@ config NVMEM_RMEM

This driver can also be built as a module. If so, the module
will be called nvmem-rmem.
+
+config NVMEM_BRCM_NVRAM
+ tristate "Broadcom's NVRAM support"
+ depends on ARCH_BCM_5301X || COMPILE_TEST
+ depends on HAS_IOMEM
+ help
+ This driver provides support for Broadcom's NVRAM that can be accessed
+ using I/O mapping.
+
endif
diff --git a/drivers/nvmem/Makefile b/drivers/nvmem/Makefile
index 5376b8e0dae5..bbea1410240a 100644
--- a/drivers/nvmem/Makefile
+++ b/drivers/nvmem/Makefile
@@ -57,3 +57,5 @@ obj-$(CONFIG_SPRD_EFUSE) += nvmem_sprd_efuse.o
nvmem_sprd_efuse-y := sprd-efuse.o
obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o
nvmem-rmem-y := rmem.o
+obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
+nvmem_brcm_nvram-y := brcm_nvram.o
diff --git a/drivers/nvmem/brcm_nvram.c b/drivers/nvmem/brcm_nvram.c
new file mode 100644
index 000000000000..bd2ecaaf4585
--- /dev/null
+++ b/drivers/nvmem/brcm_nvram.c
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2021 Rafał Miłecki <[email protected]>
+ */
+
+#include <linux/io.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/nvmem-provider.h>
+#include <linux/platform_device.h>
+
+struct brcm_nvram {
+ struct device *dev;
+ void __iomem *base;
+};
+
+static int brcm_nvram_read(void *context, unsigned int offset, void *val,
+ size_t bytes)
+{
+ struct brcm_nvram *priv = context;
+ u8 *dst = val;
+
+ while (bytes--)
+ *dst++ = readb(priv->base + offset++);
+
+ return 0;
+}
+
+static int brcm_nvram_probe(struct platform_device *pdev)
+{
+ struct nvmem_config config = {
+ .name = "brcm-nvram",
+ .reg_read = brcm_nvram_read,
+ };
+ struct device *dev = &pdev->dev;
+ struct resource *res;
+ struct brcm_nvram *priv;
+
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+ priv->dev = dev;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ priv->base = devm_ioremap_resource(dev, res);
+ if (IS_ERR(priv->base))
+ return PTR_ERR(priv->base);
+
+ config.dev = dev;
+ config.priv = priv;
+ config.size = resource_size(res);
+
+ return PTR_ERR_OR_ZERO(devm_nvmem_register(dev, &config));
+}
+
+static const struct of_device_id brcm_nvram_of_match_table[] = {
+ { .compatible = "brcm,nvram", },
+ {},
+};
+
+static struct platform_driver brcm_nvram_driver = {
+ .probe = brcm_nvram_probe,
+ .driver = {
+ .name = "brcm_nvram",
+ .of_match_table = brcm_nvram_of_match_table,
+ },
+};
+
+static int __init brcm_nvram_init(void)
+{
+ return platform_driver_register(&brcm_nvram_driver);
+}
+
+subsys_initcall_sync(brcm_nvram_init);
+
+MODULE_AUTHOR("Rafał Miłecki");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(of, brcm_nvram_of_match_table);
--
2.26.2

2021-03-10 03:04:21

by Rob Herring

[permalink] [raw]
Subject: Re: [PATCH V2 1/2] dt-bindings: nvmem: add Broadcom's NVRAM

On Fri, 05 Mar 2021 19:32:35 +0100, Rafał Miłecki wrote:
> From: Rafał Miłecki <[email protected]>
>
> Broadcom's NVRAM structure contains device data and can be accessed
> using I/O mapping.
>
> Signed-off-by: Rafał Miłecki <[email protected]>
> ---
> V2: Use Broadcom's NVRAM specific binding. Generic "nvmem-iomap" binding
> didn't make much sense. Thanks Srinivas!
> ---
> .../devicetree/bindings/nvmem/brcm,nvram.yaml | 34 +++++++++++++++++++
> 1 file changed, 34 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/nvmem/brcm,nvram.yaml
>

Reviewed-by: Rob Herring <[email protected]>

2021-03-10 10:27:28

by Srinivas Kandagatla

[permalink] [raw]
Subject: Re: [PATCH V2 1/2] dt-bindings: nvmem: add Broadcom's NVRAM



On 05/03/2021 18:32, Rafał Miłecki wrote:
> From: Rafał Miłecki <[email protected]>
>
> Broadcom's NVRAM structure contains device data and can be accessed
> using I/O mapping.
>
> Signed-off-by: Rafał Miłecki <[email protected]>
> ---


Applied both patches!


thanks
-srini

> V2: Use Broadcom's NVRAM specific binding. Generic "nvmem-iomap" binding
> didn't make much sense. Thanks Srinivas!
> ---
> .../devicetree/bindings/nvmem/brcm,nvram.yaml | 34 +++++++++++++++++++
> 1 file changed, 34 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/nvmem/brcm,nvram.yaml
>
> diff --git a/Documentation/devicetree/bindings/nvmem/brcm,nvram.yaml b/Documentation/devicetree/bindings/nvmem/brcm,nvram.yaml
> new file mode 100644
> index 000000000000..58ff6b0bdb1a
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/nvmem/brcm,nvram.yaml
> @@ -0,0 +1,34 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/nvmem/brcm,nvram.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Broadcom's NVRAM
> +
> +description: |
> + Broadcom's NVRAM is a structure containing device specific environment
> + variables. It is used for storing device configuration, booting parameters
> + and calibration data.
> +
> + NVRAM can be accessed on Broadcom BCM47xx MIPS and Northstar ARM Cortex-A9
> + devices usiong I/O mapped memory.
> +
> +maintainers:
> + - Rafał Miłecki <[email protected]>
> +
> +allOf:
> + - $ref: "nvmem.yaml#"
> +
> +properties:
> + compatible:
> + const: brcm,nvram
> +
> +unevaluatedProperties: false
> +
> +examples:
> + - |
> + nvram@1eff0000 {
> + compatible = "brcm,nvram";
> + reg = <0x1eff0000 0x10000>;
> + };
>