On 3/1/21 11:44 PM, Rafał Miłecki wrote:
> From: Rafał Miłecki <ra...@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 <ra...@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

> ---
>  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

Reply via email to